From 6db0e85847fe2e3ed7b0d102a8530e0bedf701b4 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Mon, 3 Oct 2011 09:13:45 -0400 Subject: [PATCH] --- yaml --- r: 264237 b: refs/heads/master c: 109bc10d30f33e84f1d7289f0039e0c858ade82f h: refs/heads/master i: 264235: b2ebab372ca5479b9f289f3d306daaf8fbc106a2 v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/radeon/atombios_dp.c | 4 +- trunk/drivers/hwmon/coretemp.c | 28 ++++--- trunk/drivers/ide/ide-disk.c | 7 +- trunk/drivers/misc/lis3lv02d/lis3lv02d.c | 14 ++-- trunk/drivers/pci/pci.c | 6 +- trunk/drivers/pci/probe.c | 14 +--- trunk/drivers/spi/spi-topcliff-pch.c | 93 +++++++--------------- trunk/fs/btrfs/file.c | 24 ++---- trunk/include/linux/pci.h | 3 +- 10 files changed, 63 insertions(+), 132 deletions(-) diff --git a/[refs] b/[refs] index d41d788c3539..6d3582dd6d1a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f8451c3f15982ebdf71f7b5e155ade38efc5993f +refs/heads/master: 109bc10d30f33e84f1d7289f0039e0c858ade82f diff --git a/trunk/drivers/gpu/drm/radeon/atombios_dp.c b/trunk/drivers/gpu/drm/radeon/atombios_dp.c index 7ad43c6b1db7..f526fa77e320 100644 --- a/trunk/drivers/gpu/drm/radeon/atombios_dp.c +++ b/trunk/drivers/gpu/drm/radeon/atombios_dp.c @@ -158,14 +158,14 @@ static int radeon_dp_aux_native_read(struct radeon_connector *radeon_connector, while (1) { ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, msg, msg_bytes, recv, recv_bytes, delay, &ack); - if (ret == 0) - return -EPROTO; if (ret < 0) return ret; if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_ACK) return ret; else if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_DEFER) udelay(400); + else if (ret == 0) + return -EPROTO; else return -EIO; } diff --git a/trunk/drivers/hwmon/coretemp.c b/trunk/drivers/hwmon/coretemp.c index 932383786642..44b23917d4cc 100644 --- a/trunk/drivers/hwmon/coretemp.c +++ b/trunk/drivers/hwmon/coretemp.c @@ -377,9 +377,9 @@ static int create_core_attrs(struct temp_data *tdata, struct device *dev, } -static int __cpuinit chk_ucode_version(unsigned int cpu) +static int __devinit chk_ucode_version(struct platform_device *pdev) { - struct cpuinfo_x86 *c = &cpu_data(cpu); + struct cpuinfo_x86 *c = &cpu_data(pdev->id); int err; u32 edx; @@ -390,15 +390,17 @@ static int __cpuinit chk_ucode_version(unsigned int cpu) */ if (c->x86_model == 0xe && c->x86_mask < 0xc) { /* check for microcode update */ - err = smp_call_function_single(cpu, get_ucode_rev_on_cpu, + err = smp_call_function_single(pdev->id, get_ucode_rev_on_cpu, &edx, 1); if (err) { - pr_err("Cannot determine microcode revision of " - "CPU#%u (%d)!\n", cpu, err); + dev_err(&pdev->dev, + "Cannot determine microcode revision of " + "CPU#%u (%d)!\n", pdev->id, err); return -ENODEV; } else if (edx < 0x39) { - pr_err("Errata AE18 not fixed, update BIOS or " - "microcode of the CPU!\n"); + dev_err(&pdev->dev, + "Errata AE18 not fixed, update BIOS or " + "microcode of the CPU!\n"); return -ENODEV; } } @@ -506,7 +508,6 @@ static int create_core_data(struct platform_device *pdev, return 0; exit_free: - pdata->core_data[attr_no] = NULL; kfree(tdata); return err; } @@ -543,6 +544,11 @@ static int __devinit coretemp_probe(struct platform_device *pdev) struct platform_data *pdata; int err; + /* Check the microcode version of the CPU */ + err = chk_ucode_version(pdev); + if (err) + return err; + /* Initialize the per-package data structures */ pdata = kzalloc(sizeof(struct platform_data), GFP_KERNEL); if (!pdata) @@ -624,7 +630,7 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) } pdev_entry->pdev = pdev; - pdev_entry->phys_proc_id = pdev->id; + pdev_entry->phys_proc_id = TO_PHYS_ID(cpu); list_add_tail(&pdev_entry->list, &pdev_list); mutex_unlock(&pdev_list_mutex); @@ -685,10 +691,6 @@ static void __cpuinit get_core_online(unsigned int cpu) return; if (!pdev) { - /* Check the microcode version of the CPU */ - if (chk_ucode_version(cpu)) - return; - /* * Alright, we have DTS support. * We are bringing the _first_ core in this pkg diff --git a/trunk/drivers/ide/ide-disk.c b/trunk/drivers/ide/ide-disk.c index 16f69be820c7..274798068a54 100644 --- a/trunk/drivers/ide/ide-disk.c +++ b/trunk/drivers/ide/ide-disk.c @@ -435,12 +435,7 @@ static int idedisk_prep_fn(struct request_queue *q, struct request *rq) if (!(rq->cmd_flags & REQ_FLUSH)) return BLKPREP_OK; - if (rq->special) { - cmd = rq->special; - memset(cmd, 0, sizeof(*cmd)); - } else { - cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); - } + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); /* FIXME: map struct ide_taskfile on rq->cmd[] */ BUG_ON(cmd == NULL); diff --git a/trunk/drivers/misc/lis3lv02d/lis3lv02d.c b/trunk/drivers/misc/lis3lv02d/lis3lv02d.c index 8b51cd62d067..b928bc14e97b 100644 --- a/trunk/drivers/misc/lis3lv02d/lis3lv02d.c +++ b/trunk/drivers/misc/lis3lv02d/lis3lv02d.c @@ -375,14 +375,12 @@ void lis3lv02d_poweron(struct lis3lv02d *lis3) * both have been read. So the value read will always be correct. * Set BOOT bit to refresh factory tuning values. */ - if (lis3->pdata) { - lis3->read(lis3, CTRL_REG2, ®); - if (lis3->whoami == WAI_12B) - reg |= CTRL2_BDU | CTRL2_BOOT; - else - reg |= CTRL2_BOOT_8B; - lis3->write(lis3, CTRL_REG2, reg); - } + lis3->read(lis3, CTRL_REG2, ®); + if (lis3->whoami == WAI_12B) + reg |= CTRL2_BDU | CTRL2_BOOT; + else + reg |= CTRL2_BOOT_8B; + lis3->write(lis3, CTRL_REG2, reg); /* LIS3 power on delay is quite long */ msleep(lis3->pwron_delay / lis3lv02d_get_odr()); diff --git a/trunk/drivers/pci/pci.c b/trunk/drivers/pci/pci.c index e9651f0a8817..4e84fd4a4312 100644 --- a/trunk/drivers/pci/pci.c +++ b/trunk/drivers/pci/pci.c @@ -77,7 +77,7 @@ unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE; unsigned long pci_hotplug_io_size = DEFAULT_HOTPLUG_IO_SIZE; unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE; -enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_TUNE_OFF; +enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_SAFE; /* * The default CLS is used if arch didn't set CLS explicitly and not @@ -3568,14 +3568,10 @@ static int __init pci_setup(char *str) pci_hotplug_io_size = memparse(str + 9, &str); } else if (!strncmp(str, "hpmemsize=", 10)) { pci_hotplug_mem_size = memparse(str + 10, &str); - } else if (!strncmp(str, "pcie_bus_tune_off", 17)) { - pcie_bus_config = PCIE_BUS_TUNE_OFF; } else if (!strncmp(str, "pcie_bus_safe", 13)) { pcie_bus_config = PCIE_BUS_SAFE; } else if (!strncmp(str, "pcie_bus_perf", 13)) { pcie_bus_config = PCIE_BUS_PERFORMANCE; - } else if (!strncmp(str, "pcie_bus_peer2peer", 18)) { - pcie_bus_config = PCIE_BUS_PEER2PEER; } else { printk(KERN_ERR "PCI: Unknown option `%s'\n", str); diff --git a/trunk/drivers/pci/probe.c b/trunk/drivers/pci/probe.c index 6ab6bd3df4b2..f3f94a5c068f 100644 --- a/trunk/drivers/pci/probe.c +++ b/trunk/drivers/pci/probe.c @@ -1458,24 +1458,12 @@ static int pcie_bus_configure_set(struct pci_dev *dev, void *data) */ void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss) { - u8 smpss; + u8 smpss = mpss; if (!pci_is_pcie(bus->self)) return; - if (pcie_bus_config == PCIE_BUS_TUNE_OFF) - return; - - /* FIXME - Peer to peer DMA is possible, though the endpoint would need - * to be aware to the MPS of the destination. To work around this, - * simply force the MPS of the entire system to the smallest possible. - */ - if (pcie_bus_config == PCIE_BUS_PEER2PEER) - smpss = 0; - if (pcie_bus_config == PCIE_BUS_SAFE) { - smpss = mpss; - pcie_find_smpss(bus->self, &smpss); pci_walk_bus(bus, pcie_find_smpss, &smpss); } diff --git a/trunk/drivers/spi/spi-topcliff-pch.c b/trunk/drivers/spi/spi-topcliff-pch.c index 6a80749391db..1d23f3831866 100644 --- a/trunk/drivers/spi/spi-topcliff-pch.c +++ b/trunk/drivers/spi/spi-topcliff-pch.c @@ -50,8 +50,6 @@ #define PCH_RX_THOLD 7 #define PCH_RX_THOLD_MAX 15 -#define PCH_TX_THOLD 2 - #define PCH_MAX_BAUDRATE 5000000 #define PCH_MAX_FIFO_DEPTH 16 @@ -60,7 +58,6 @@ #define PCH_SLEEP_TIME 10 #define SSN_LOW 0x02U -#define SSN_HIGH 0x03U #define SSN_NO_CONTROL 0x00U #define PCH_MAX_CS 0xFF #define PCI_DEVICE_ID_GE_SPI 0x8816 @@ -319,19 +316,16 @@ static void pch_spi_handler_sub(struct pch_spi_data *data, u32 reg_spsr_val, /* if transfer complete interrupt */ if (reg_spsr_val & SPSR_FI_BIT) { - if ((tx_index == bpw_len) && (rx_index == tx_index)) { - /* disable interrupts */ - pch_spi_setclr_reg(data->master, PCH_SPCR, 0, PCH_ALL); - - /* transfer is completed; - inform pch_spi_process_messages */ - data->transfer_complete = true; - data->transfer_active = false; - wake_up(&data->wait); - } else { + if (tx_index < bpw_len) dev_err(&data->master->dev, "%s : Transfer is not completed", __func__); - } + /* disable interrupts */ + pch_spi_setclr_reg(data->master, PCH_SPCR, 0, PCH_ALL); + + /* transfer is completed;inform pch_spi_process_messages */ + data->transfer_complete = true; + data->transfer_active = false; + wake_up(&data->wait); } } @@ -354,26 +348,16 @@ static irqreturn_t pch_spi_handler(int irq, void *dev_id) "%s returning due to suspend\n", __func__); return IRQ_NONE; } + if (data->use_dma) + return IRQ_NONE; io_remap_addr = data->io_remap_addr; spsr = io_remap_addr + PCH_SPSR; reg_spsr_val = ioread32(spsr); - if (reg_spsr_val & SPSR_ORF_BIT) { - dev_err(&board_dat->pdev->dev, "%s Over run error\n", __func__); - if (data->current_msg->complete != 0) { - data->transfer_complete = true; - data->current_msg->status = -EIO; - data->current_msg->complete(data->current_msg->context); - data->bcurrent_msg_processing = false; - data->current_msg = NULL; - data->cur_trans = NULL; - } - } - - if (data->use_dma) - return IRQ_NONE; + if (reg_spsr_val & SPSR_ORF_BIT) + dev_err(&board_dat->pdev->dev, "%s Over run error", __func__); /* Check if the interrupt is for SPI device */ if (reg_spsr_val & (SPSR_FI_BIT | SPSR_RFI_BIT)) { @@ -772,6 +756,10 @@ static void pch_spi_set_ir(struct pch_spi_data *data) wait_event_interruptible(data->wait, data->transfer_complete); + pch_spi_writereg(data->master, PCH_SSNXCR, SSN_NO_CONTROL); + dev_dbg(&data->master->dev, + "%s:no more control over SSN-writing 0 to SSNXCR.", __func__); + /* clear all interrupts */ pch_spi_writereg(data->master, PCH_SPSR, pch_spi_readreg(data->master, PCH_SPSR)); @@ -827,11 +815,10 @@ static void pch_spi_copy_rx_data_for_dma(struct pch_spi_data *data, int bpw) } } -static int pch_spi_start_transfer(struct pch_spi_data *data) +static void pch_spi_start_transfer(struct pch_spi_data *data) { struct pch_spi_dma_ctrl *dma; unsigned long flags; - int rtn; dma = &data->dma; @@ -846,23 +833,19 @@ static int pch_spi_start_transfer(struct pch_spi_data *data) initiating the transfer. */ dev_dbg(&data->master->dev, "%s:waiting for transfer to get over\n", __func__); - rtn = wait_event_interruptible_timeout(data->wait, - data->transfer_complete, - msecs_to_jiffies(2 * HZ)); + wait_event_interruptible(data->wait, data->transfer_complete); dma_sync_sg_for_cpu(&data->master->dev, dma->sg_rx_p, dma->nent, DMA_FROM_DEVICE); - - dma_sync_sg_for_cpu(&data->master->dev, dma->sg_tx_p, dma->nent, - DMA_FROM_DEVICE); - memset(data->dma.tx_buf_virt, 0, PAGE_SIZE); - async_tx_ack(dma->desc_rx); async_tx_ack(dma->desc_tx); kfree(dma->sg_tx_p); kfree(dma->sg_rx_p); spin_lock_irqsave(&data->lock, flags); + pch_spi_writereg(data->master, PCH_SSNXCR, SSN_NO_CONTROL); + dev_dbg(&data->master->dev, + "%s:no more control over SSN-writing 0 to SSNXCR.", __func__); /* clear fifo threshold, disable interrupts, disable SPI transfer */ pch_spi_setclr_reg(data->master, PCH_SPCR, 0, @@ -875,8 +858,6 @@ static int pch_spi_start_transfer(struct pch_spi_data *data) pch_spi_clear_fifo(data->master); spin_unlock_irqrestore(&data->lock, flags); - - return rtn; } static void pch_dma_rx_complete(void *arg) @@ -1042,7 +1023,8 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) /* set receive fifo threshold and transmit fifo threshold */ pch_spi_setclr_reg(data->master, PCH_SPCR, ((size - 1) << SPCR_RFIC_FIELD) | - (PCH_TX_THOLD << SPCR_TFIC_FIELD), + ((PCH_MAX_FIFO_DEPTH - PCH_DMA_TRANS_SIZE) << + SPCR_TFIC_FIELD), MASK_RFIC_SPCR_BITS | MASK_TFIC_SPCR_BITS); spin_unlock_irqrestore(&data->lock, flags); @@ -1053,20 +1035,13 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) /* offset, length setting */ sg = dma->sg_rx_p; for (i = 0; i < num; i++, sg++) { - if (i == (num - 2)) { - sg->offset = size * i; - sg->offset = sg->offset * (*bpw / 8); + if (i == 0) { + sg->offset = 0; sg_set_page(sg, virt_to_page(dma->rx_buf_virt), rem, sg->offset); sg_dma_len(sg) = rem; - } else if (i == (num - 1)) { - sg->offset = size * (i - 1) + rem; - sg->offset = sg->offset * (*bpw / 8); - sg_set_page(sg, virt_to_page(dma->rx_buf_virt), size, - sg->offset); - sg_dma_len(sg) = size; } else { - sg->offset = size * i; + sg->offset = rem + size * (i - 1); sg->offset = sg->offset * (*bpw / 8); sg_set_page(sg, virt_to_page(dma->rx_buf_virt), size, sg->offset); @@ -1090,16 +1065,6 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) dma->desc_rx = desc_rx; /* TX */ - if (data->bpw_len > PCH_DMA_TRANS_SIZE) { - num = data->bpw_len / PCH_DMA_TRANS_SIZE; - size = PCH_DMA_TRANS_SIZE; - rem = 16; - } else { - num = 1; - size = data->bpw_len; - rem = data->bpw_len; - } - dma->sg_tx_p = kzalloc(sizeof(struct scatterlist)*num, GFP_ATOMIC); sg_init_table(dma->sg_tx_p, num); /* Initialize SG table */ /* offset, length setting */ @@ -1197,7 +1162,6 @@ static void pch_spi_process_messages(struct work_struct *pwork) if (data->use_dma) pch_spi_request_dma(data, data->current_msg->spi->bits_per_word); - pch_spi_writereg(data->master, PCH_SSNXCR, SSN_NO_CONTROL); do { /* If we are already processing a message get the next transfer structure from the message otherwise retrieve @@ -1220,8 +1184,7 @@ static void pch_spi_process_messages(struct work_struct *pwork) if (data->use_dma) { pch_spi_handle_dma(data, &bpw); - if (!pch_spi_start_transfer(data)) - goto out; + pch_spi_start_transfer(data); pch_spi_copy_rx_data_for_dma(data, bpw); } else { pch_spi_set_tx(data, &bpw); @@ -1259,8 +1222,6 @@ static void pch_spi_process_messages(struct work_struct *pwork) } while (data->cur_trans != NULL); -out: - pch_spi_writereg(data->master, PCH_SSNXCR, SSN_HIGH); if (data->use_dma) pch_spi_release_dma(data); } diff --git a/trunk/fs/btrfs/file.c b/trunk/fs/btrfs/file.c index e4e57d59edb7..a381cd22f518 100644 --- a/trunk/fs/btrfs/file.c +++ b/trunk/fs/btrfs/file.c @@ -1036,13 +1036,11 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans, * on error we return an unlocked page and the error value * on success we return a locked page and 0 */ -static int prepare_uptodate_page(struct page *page, u64 pos, - bool force_uptodate) +static int prepare_uptodate_page(struct page *page, u64 pos) { int ret = 0; - if (((pos & (PAGE_CACHE_SIZE - 1)) || force_uptodate) && - !PageUptodate(page)) { + if ((pos & (PAGE_CACHE_SIZE - 1)) && !PageUptodate(page)) { ret = btrfs_readpage(NULL, page); if (ret) return ret; @@ -1063,7 +1061,7 @@ static int prepare_uptodate_page(struct page *page, u64 pos, static noinline int prepare_pages(struct btrfs_root *root, struct file *file, struct page **pages, size_t num_pages, loff_t pos, unsigned long first_index, - size_t write_bytes, bool force_uptodate) + size_t write_bytes) { struct extent_state *cached_state = NULL; int i; @@ -1088,11 +1086,10 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file, } if (i == 0) - err = prepare_uptodate_page(pages[i], pos, - force_uptodate); + err = prepare_uptodate_page(pages[i], pos); if (i == num_pages - 1) err = prepare_uptodate_page(pages[i], - pos + write_bytes, false); + pos + write_bytes); if (err) { page_cache_release(pages[i]); faili = i - 1; @@ -1161,7 +1158,6 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, size_t num_written = 0; int nrptrs; int ret = 0; - bool force_page_uptodate = false; nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / @@ -1204,8 +1200,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, * contents of pages from loop to loop */ ret = prepare_pages(root, file, pages, num_pages, - pos, first_index, write_bytes, - force_page_uptodate); + pos, first_index, write_bytes); if (ret) { btrfs_delalloc_release_space(inode, num_pages << PAGE_CACHE_SHIFT); @@ -1222,15 +1217,12 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, if (copied < write_bytes) nrptrs = 1; - if (copied == 0) { - force_page_uptodate = true; + if (copied == 0) dirty_pages = 0; - } else { - force_page_uptodate = false; + else dirty_pages = (copied + offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - } /* * If we had a short copy we need to release the excess delaloc diff --git a/trunk/include/linux/pci.h b/trunk/include/linux/pci.h index 9fc01226055b..8c230cbcbb48 100644 --- a/trunk/include/linux/pci.h +++ b/trunk/include/linux/pci.h @@ -621,9 +621,8 @@ struct pci_driver { extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss); enum pcie_bus_config_types { - PCIE_BUS_TUNE_OFF, - PCIE_BUS_SAFE, PCIE_BUS_PERFORMANCE, + PCIE_BUS_SAFE, PCIE_BUS_PEER2PEER, };