diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/mspec.c | 26 | ||||
-rw-r--r-- | drivers/input/mouse/appletouch.c | 6 | ||||
-rw-r--r-- | drivers/lguest/lguest_asm.S | 6 | ||||
-rw-r--r-- | drivers/net/pcmcia/3c589_cs.c | 2 | ||||
-rw-r--r-- | drivers/net/r8169.c | 14 | ||||
-rw-r--r-- | drivers/net/sky2.c | 37 | ||||
-rw-r--r-- | drivers/net/sky2.h | 2 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_spi.c | 28 | ||||
-rw-r--r-- | drivers/w1/w1.c | 1 |
9 files changed, 77 insertions, 45 deletions
diff --git a/drivers/char/mspec.c b/drivers/char/mspec.c index 049a46cc9f87..04ac155d3a07 100644 --- a/drivers/char/mspec.c +++ b/drivers/char/mspec.c | |||
@@ -155,23 +155,22 @@ mspec_open(struct vm_area_struct *vma) | |||
155 | * mspec_close | 155 | * mspec_close |
156 | * | 156 | * |
157 | * Called when unmapping a device mapping. Frees all mspec pages | 157 | * Called when unmapping a device mapping. Frees all mspec pages |
158 | * belonging to the vma. | 158 | * belonging to all the vma's sharing this vma_data structure. |
159 | */ | 159 | */ |
160 | static void | 160 | static void |
161 | mspec_close(struct vm_area_struct *vma) | 161 | mspec_close(struct vm_area_struct *vma) |
162 | { | 162 | { |
163 | struct vma_data *vdata; | 163 | struct vma_data *vdata; |
164 | int index, last_index, result; | 164 | int index, last_index; |
165 | unsigned long my_page; | 165 | unsigned long my_page; |
166 | 166 | ||
167 | vdata = vma->vm_private_data; | 167 | vdata = vma->vm_private_data; |
168 | 168 | ||
169 | BUG_ON(vma->vm_start < vdata->vm_start || vma->vm_end > vdata->vm_end); | 169 | if (!atomic_dec_and_test(&vdata->refcnt)) |
170 | return; | ||
170 | 171 | ||
171 | spin_lock(&vdata->lock); | 172 | last_index = (vdata->vm_end - vdata->vm_start) >> PAGE_SHIFT; |
172 | index = (vma->vm_start - vdata->vm_start) >> PAGE_SHIFT; | 173 | for (index = 0; index < last_index; index++) { |
173 | last_index = (vma->vm_end - vdata->vm_start) >> PAGE_SHIFT; | ||
174 | for (; index < last_index; index++) { | ||
175 | if (vdata->maddr[index] == 0) | 174 | if (vdata->maddr[index] == 0) |
176 | continue; | 175 | continue; |
177 | /* | 176 | /* |
@@ -180,20 +179,12 @@ mspec_close(struct vm_area_struct *vma) | |||
180 | */ | 179 | */ |
181 | my_page = vdata->maddr[index]; | 180 | my_page = vdata->maddr[index]; |
182 | vdata->maddr[index] = 0; | 181 | vdata->maddr[index] = 0; |
183 | spin_unlock(&vdata->lock); | 182 | if (!mspec_zero_block(my_page, PAGE_SIZE)) |
184 | result = mspec_zero_block(my_page, PAGE_SIZE); | ||
185 | if (!result) | ||
186 | uncached_free_page(my_page); | 183 | uncached_free_page(my_page); |
187 | else | 184 | else |
188 | printk(KERN_WARNING "mspec_close(): " | 185 | printk(KERN_WARNING "mspec_close(): " |
189 | "failed to zero page %i\n", | 186 | "failed to zero page %ld\n", my_page); |
190 | result); | ||
191 | spin_lock(&vdata->lock); | ||
192 | } | 187 | } |
193 | spin_unlock(&vdata->lock); | ||
194 | |||
195 | if (!atomic_dec_and_test(&vdata->refcnt)) | ||
196 | return; | ||
197 | 188 | ||
198 | if (vdata->flags & VMD_VMALLOCED) | 189 | if (vdata->flags & VMD_VMALLOCED) |
199 | vfree(vdata); | 190 | vfree(vdata); |
@@ -201,7 +192,6 @@ mspec_close(struct vm_area_struct *vma) | |||
201 | kfree(vdata); | 192 | kfree(vdata); |
202 | } | 193 | } |
203 | 194 | ||
204 | |||
205 | /* | 195 | /* |
206 | * mspec_nopfn | 196 | * mspec_nopfn |
207 | * | 197 | * |
diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c index 2bea1b2c631c..a1804bfdbb8c 100644 --- a/drivers/input/mouse/appletouch.c +++ b/drivers/input/mouse/appletouch.c | |||
@@ -328,6 +328,7 @@ static void atp_complete(struct urb* urb) | |||
328 | { | 328 | { |
329 | int x, y, x_z, y_z, x_f, y_f; | 329 | int x, y, x_z, y_z, x_f, y_f; |
330 | int retval, i, j; | 330 | int retval, i, j; |
331 | int key; | ||
331 | struct atp *dev = urb->context; | 332 | struct atp *dev = urb->context; |
332 | 333 | ||
333 | switch (urb->status) { | 334 | switch (urb->status) { |
@@ -468,6 +469,7 @@ static void atp_complete(struct urb* urb) | |||
468 | ATP_XFACT, &x_z, &x_f); | 469 | ATP_XFACT, &x_z, &x_f); |
469 | y = atp_calculate_abs(dev->xy_acc + ATP_XSENSORS, ATP_YSENSORS, | 470 | y = atp_calculate_abs(dev->xy_acc + ATP_XSENSORS, ATP_YSENSORS, |
470 | ATP_YFACT, &y_z, &y_f); | 471 | ATP_YFACT, &y_z, &y_f); |
472 | key = dev->data[dev->datalen - 1] & 1; | ||
471 | 473 | ||
472 | if (x && y) { | 474 | if (x && y) { |
473 | if (dev->x_old != -1) { | 475 | if (dev->x_old != -1) { |
@@ -505,7 +507,7 @@ static void atp_complete(struct urb* urb) | |||
505 | the first touch unless reinitialised. Do so if it's been | 507 | the first touch unless reinitialised. Do so if it's been |
506 | idle for a while in order to avoid waking the kernel up | 508 | idle for a while in order to avoid waking the kernel up |
507 | several hundred times a second */ | 509 | several hundred times a second */ |
508 | if (atp_is_geyser_3(dev)) { | 510 | if (!key && atp_is_geyser_3(dev)) { |
509 | dev->idlecount++; | 511 | dev->idlecount++; |
510 | if (dev->idlecount == 10) { | 512 | if (dev->idlecount == 10) { |
511 | dev->valid = 0; | 513 | dev->valid = 0; |
@@ -514,7 +516,7 @@ static void atp_complete(struct urb* urb) | |||
514 | } | 516 | } |
515 | } | 517 | } |
516 | 518 | ||
517 | input_report_key(dev->input, BTN_LEFT, dev->data[dev->datalen - 1] & 1); | 519 | input_report_key(dev->input, BTN_LEFT, key); |
518 | input_sync(dev->input); | 520 | input_sync(dev->input); |
519 | 521 | ||
520 | exit: | 522 | exit: |
diff --git a/drivers/lguest/lguest_asm.S b/drivers/lguest/lguest_asm.S index f182c6a36209..1ddcd5cd20f6 100644 --- a/drivers/lguest/lguest_asm.S +++ b/drivers/lguest/lguest_asm.S | |||
@@ -22,8 +22,9 @@ | |||
22 | jmp lguest_init | 22 | jmp lguest_init |
23 | 23 | ||
24 | /*G:055 We create a macro which puts the assembler code between lgstart_ and | 24 | /*G:055 We create a macro which puts the assembler code between lgstart_ and |
25 | * lgend_ markers. These templates end up in the .init.text section, so they | 25 | * lgend_ markers. These templates are put in the .text section: they can't be |
26 | * are discarded after boot. */ | 26 | * discarded after boot as we may need to patch modules, too. */ |
27 | .text | ||
27 | #define LGUEST_PATCH(name, insns...) \ | 28 | #define LGUEST_PATCH(name, insns...) \ |
28 | lgstart_##name: insns; lgend_##name:; \ | 29 | lgstart_##name: insns; lgend_##name:; \ |
29 | .globl lgstart_##name; .globl lgend_##name | 30 | .globl lgstart_##name; .globl lgend_##name |
@@ -34,7 +35,6 @@ LGUEST_PATCH(popf, movl %eax, lguest_data+LGUEST_DATA_irq_enabled) | |||
34 | LGUEST_PATCH(pushf, movl lguest_data+LGUEST_DATA_irq_enabled, %eax) | 35 | LGUEST_PATCH(pushf, movl lguest_data+LGUEST_DATA_irq_enabled, %eax) |
35 | /*:*/ | 36 | /*:*/ |
36 | 37 | ||
37 | .text | ||
38 | /* These demark the EIP range where host should never deliver interrupts. */ | 38 | /* These demark the EIP range where host should never deliver interrupts. */ |
39 | .global lguest_noirq_start | 39 | .global lguest_noirq_start |
40 | .global lguest_noirq_end | 40 | .global lguest_noirq_end |
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index c06cae3f0b56..503f2685fb73 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c | |||
@@ -116,7 +116,7 @@ struct el3_private { | |||
116 | spinlock_t lock; | 116 | spinlock_t lock; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | static const char *if_names[] = { "auto", "10base2", "10baseT", "AUI" }; | 119 | static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" }; |
120 | 120 | ||
121 | /*====================================================================*/ | 121 | /*====================================================================*/ |
122 | 122 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index b85ab4a8f2a3..c921ec32c232 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -1228,7 +1228,10 @@ static void rtl8169_hw_phy_config(struct net_device *dev) | |||
1228 | return; | 1228 | return; |
1229 | } | 1229 | } |
1230 | 1230 | ||
1231 | /* phy config for RTL8169s mac_version C chip */ | 1231 | if ((tp->mac_version != RTL_GIGA_MAC_VER_02) && |
1232 | (tp->mac_version != RTL_GIGA_MAC_VER_03)) | ||
1233 | return; | ||
1234 | |||
1232 | mdio_write(ioaddr, 31, 0x0001); //w 31 2 0 1 | 1235 | mdio_write(ioaddr, 31, 0x0001); //w 31 2 0 1 |
1233 | mdio_write(ioaddr, 21, 0x1000); //w 21 15 0 1000 | 1236 | mdio_write(ioaddr, 21, 0x1000); //w 21 15 0 1000 |
1234 | mdio_write(ioaddr, 24, 0x65c7); //w 24 15 0 65c7 | 1237 | mdio_write(ioaddr, 24, 0x65c7); //w 24 15 0 65c7 |
@@ -2567,6 +2570,15 @@ static void rtl8169_tx_interrupt(struct net_device *dev, | |||
2567 | (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) { | 2570 | (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) { |
2568 | netif_wake_queue(dev); | 2571 | netif_wake_queue(dev); |
2569 | } | 2572 | } |
2573 | /* | ||
2574 | * 8168 hack: TxPoll requests are lost when the Tx packets are | ||
2575 | * too close. Let's kick an extra TxPoll request when a burst | ||
2576 | * of start_xmit activity is detected (if it is not detected, | ||
2577 | * it is slow enough). -- FR | ||
2578 | */ | ||
2579 | smp_rmb(); | ||
2580 | if (tp->cur_tx != dirty_tx) | ||
2581 | RTL_W8(TxPoll, NPQ); | ||
2570 | } | 2582 | } |
2571 | } | 2583 | } |
2572 | 2584 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index eaffe551d1d8..0792031a5cf9 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -338,6 +338,16 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) | |||
338 | if (!(hw->flags & SKY2_HW_GIGABIT)) { | 338 | if (!(hw->flags & SKY2_HW_GIGABIT)) { |
339 | /* enable automatic crossover */ | 339 | /* enable automatic crossover */ |
340 | ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; | 340 | ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; |
341 | |||
342 | if (hw->chip_id == CHIP_ID_YUKON_FE_P && | ||
343 | hw->chip_rev == CHIP_REV_YU_FE2_A0) { | ||
344 | u16 spec; | ||
345 | |||
346 | /* Enable Class A driver for FE+ A0 */ | ||
347 | spec = gm_phy_read(hw, port, PHY_MARV_FE_SPEC_2); | ||
348 | spec |= PHY_M_FESC_SEL_CL_A; | ||
349 | gm_phy_write(hw, port, PHY_MARV_FE_SPEC_2, spec); | ||
350 | } | ||
341 | } else { | 351 | } else { |
342 | /* disable energy detect */ | 352 | /* disable energy detect */ |
343 | ctrl &= ~PHY_M_PC_EN_DET_MSK; | 353 | ctrl &= ~PHY_M_PC_EN_DET_MSK; |
@@ -816,7 +826,8 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) | |||
816 | sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR); | 826 | sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR); |
817 | sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON); | 827 | sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON); |
818 | 828 | ||
819 | if (!(hw->flags & SKY2_HW_RAMBUFFER)) { | 829 | /* On chips without ram buffer, pause is controled by MAC level */ |
830 | if (sky2_read8(hw, B2_E_0) == 0) { | ||
820 | sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); | 831 | sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); |
821 | sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); | 832 | sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); |
822 | 833 | ||
@@ -1271,7 +1282,7 @@ static int sky2_up(struct net_device *dev) | |||
1271 | struct sky2_port *sky2 = netdev_priv(dev); | 1282 | struct sky2_port *sky2 = netdev_priv(dev); |
1272 | struct sky2_hw *hw = sky2->hw; | 1283 | struct sky2_hw *hw = sky2->hw; |
1273 | unsigned port = sky2->port; | 1284 | unsigned port = sky2->port; |
1274 | u32 imask; | 1285 | u32 imask, ramsize; |
1275 | int cap, err = -ENOMEM; | 1286 | int cap, err = -ENOMEM; |
1276 | struct net_device *otherdev = hw->dev[sky2->port^1]; | 1287 | struct net_device *otherdev = hw->dev[sky2->port^1]; |
1277 | 1288 | ||
@@ -1326,13 +1337,12 @@ static int sky2_up(struct net_device *dev) | |||
1326 | 1337 | ||
1327 | sky2_mac_init(hw, port); | 1338 | sky2_mac_init(hw, port); |
1328 | 1339 | ||
1329 | if (hw->flags & SKY2_HW_RAMBUFFER) { | 1340 | /* Register is number of 4K blocks on internal RAM buffer. */ |
1330 | /* Register is number of 4K blocks on internal RAM buffer. */ | 1341 | ramsize = sky2_read8(hw, B2_E_0) * 4; |
1331 | u32 ramsize = sky2_read8(hw, B2_E_0) * 4; | 1342 | if (ramsize > 0) { |
1332 | u32 rxspace; | 1343 | u32 rxspace; |
1333 | 1344 | ||
1334 | printk(KERN_DEBUG PFX "%s: ram buffer %dK\n", dev->name, ramsize); | 1345 | pr_debug(PFX "%s: ram buffer %dK\n", dev->name, ramsize); |
1335 | |||
1336 | if (ramsize < 16) | 1346 | if (ramsize < 16) |
1337 | rxspace = ramsize / 2; | 1347 | rxspace = ramsize / 2; |
1338 | else | 1348 | else |
@@ -1995,7 +2005,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) | |||
1995 | 2005 | ||
1996 | synchronize_irq(hw->pdev->irq); | 2006 | synchronize_irq(hw->pdev->irq); |
1997 | 2007 | ||
1998 | if (!(hw->flags & SKY2_HW_RAMBUFFER)) | 2008 | if (sky2_read8(hw, B2_E_0) == 0) |
1999 | sky2_set_tx_stfwd(hw, port); | 2009 | sky2_set_tx_stfwd(hw, port); |
2000 | 2010 | ||
2001 | ctl = gma_read16(hw, port, GM_GP_CTRL); | 2011 | ctl = gma_read16(hw, port, GM_GP_CTRL); |
@@ -2526,7 +2536,7 @@ static void sky2_watchdog(unsigned long arg) | |||
2526 | ++active; | 2536 | ++active; |
2527 | 2537 | ||
2528 | /* For chips with Rx FIFO, check if stuck */ | 2538 | /* For chips with Rx FIFO, check if stuck */ |
2529 | if ((hw->flags & SKY2_HW_RAMBUFFER) && | 2539 | if ((hw->flags & SKY2_HW_FIFO_HANG_CHECK) && |
2530 | sky2_rx_hung(dev)) { | 2540 | sky2_rx_hung(dev)) { |
2531 | pr_info(PFX "%s: receiver hang detected\n", | 2541 | pr_info(PFX "%s: receiver hang detected\n", |
2532 | dev->name); | 2542 | dev->name); |
@@ -2684,8 +2694,10 @@ static int __devinit sky2_init(struct sky2_hw *hw) | |||
2684 | switch(hw->chip_id) { | 2694 | switch(hw->chip_id) { |
2685 | case CHIP_ID_YUKON_XL: | 2695 | case CHIP_ID_YUKON_XL: |
2686 | hw->flags = SKY2_HW_GIGABIT | 2696 | hw->flags = SKY2_HW_GIGABIT |
2687 | | SKY2_HW_NEWER_PHY | 2697 | | SKY2_HW_NEWER_PHY; |
2688 | | SKY2_HW_RAMBUFFER; | 2698 | if (hw->chip_rev < 3) |
2699 | hw->flags |= SKY2_HW_FIFO_HANG_CHECK; | ||
2700 | |||
2689 | break; | 2701 | break; |
2690 | 2702 | ||
2691 | case CHIP_ID_YUKON_EC_U: | 2703 | case CHIP_ID_YUKON_EC_U: |
@@ -2711,11 +2723,10 @@ static int __devinit sky2_init(struct sky2_hw *hw) | |||
2711 | dev_err(&hw->pdev->dev, "unsupported revision Yukon-EC rev A1\n"); | 2723 | dev_err(&hw->pdev->dev, "unsupported revision Yukon-EC rev A1\n"); |
2712 | return -EOPNOTSUPP; | 2724 | return -EOPNOTSUPP; |
2713 | } | 2725 | } |
2714 | hw->flags = SKY2_HW_GIGABIT | SKY2_HW_RAMBUFFER; | 2726 | hw->flags = SKY2_HW_GIGABIT | SKY2_HW_FIFO_HANG_CHECK; |
2715 | break; | 2727 | break; |
2716 | 2728 | ||
2717 | case CHIP_ID_YUKON_FE: | 2729 | case CHIP_ID_YUKON_FE: |
2718 | hw->flags = SKY2_HW_RAMBUFFER; | ||
2719 | break; | 2730 | break; |
2720 | 2731 | ||
2721 | case CHIP_ID_YUKON_FE_P: | 2732 | case CHIP_ID_YUKON_FE_P: |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 69cd98400fe6..8bc5c54e3efa 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -2063,7 +2063,7 @@ struct sky2_hw { | |||
2063 | #define SKY2_HW_FIBRE_PHY 0x00000002 | 2063 | #define SKY2_HW_FIBRE_PHY 0x00000002 |
2064 | #define SKY2_HW_GIGABIT 0x00000004 | 2064 | #define SKY2_HW_GIGABIT 0x00000004 |
2065 | #define SKY2_HW_NEWER_PHY 0x00000008 | 2065 | #define SKY2_HW_NEWER_PHY 0x00000008 |
2066 | #define SKY2_HW_RAMBUFFER 0x00000010 /* chip has RAM FIFO */ | 2066 | #define SKY2_HW_FIFO_HANG_CHECK 0x00000010 |
2067 | #define SKY2_HW_NEW_LE 0x00000020 /* new LSOv2 format */ | 2067 | #define SKY2_HW_NEW_LE 0x00000020 /* new LSOv2 format */ |
2068 | #define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */ | 2068 | #define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */ |
2069 | #define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */ | 2069 | #define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */ |
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 6f56f8750635..4df21c92ff1e 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c | |||
@@ -787,10 +787,12 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) | |||
787 | struct scsi_target *starget = sdev->sdev_target; | 787 | struct scsi_target *starget = sdev->sdev_target; |
788 | struct Scsi_Host *shost = sdev->host; | 788 | struct Scsi_Host *shost = sdev->host; |
789 | int len = sdev->inquiry_len; | 789 | int len = sdev->inquiry_len; |
790 | int min_period = spi_min_period(starget); | ||
791 | int max_width = spi_max_width(starget); | ||
790 | /* first set us up for narrow async */ | 792 | /* first set us up for narrow async */ |
791 | DV_SET(offset, 0); | 793 | DV_SET(offset, 0); |
792 | DV_SET(width, 0); | 794 | DV_SET(width, 0); |
793 | 795 | ||
794 | if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS) | 796 | if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS) |
795 | != SPI_COMPARE_SUCCESS) { | 797 | != SPI_COMPARE_SUCCESS) { |
796 | starget_printk(KERN_ERR, starget, "Domain Validation Initial Inquiry Failed\n"); | 798 | starget_printk(KERN_ERR, starget, "Domain Validation Initial Inquiry Failed\n"); |
@@ -798,9 +800,13 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) | |||
798 | return; | 800 | return; |
799 | } | 801 | } |
800 | 802 | ||
803 | if (!scsi_device_wide(sdev)) { | ||
804 | spi_max_width(starget) = 0; | ||
805 | max_width = 0; | ||
806 | } | ||
807 | |||
801 | /* test width */ | 808 | /* test width */ |
802 | if (i->f->set_width && spi_max_width(starget) && | 809 | if (i->f->set_width && max_width) { |
803 | scsi_device_wide(sdev)) { | ||
804 | i->f->set_width(starget, 1); | 810 | i->f->set_width(starget, 1); |
805 | 811 | ||
806 | if (spi_dv_device_compare_inquiry(sdev, buffer, | 812 | if (spi_dv_device_compare_inquiry(sdev, buffer, |
@@ -809,6 +815,11 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) | |||
809 | != SPI_COMPARE_SUCCESS) { | 815 | != SPI_COMPARE_SUCCESS) { |
810 | starget_printk(KERN_ERR, starget, "Wide Transfers Fail\n"); | 816 | starget_printk(KERN_ERR, starget, "Wide Transfers Fail\n"); |
811 | i->f->set_width(starget, 0); | 817 | i->f->set_width(starget, 0); |
818 | /* Make sure we don't force wide back on by asking | ||
819 | * for a transfer period that requires it */ | ||
820 | max_width = 0; | ||
821 | if (min_period < 10) | ||
822 | min_period = 10; | ||
812 | } | 823 | } |
813 | } | 824 | } |
814 | 825 | ||
@@ -828,7 +839,8 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) | |||
828 | 839 | ||
829 | /* now set up to the maximum */ | 840 | /* now set up to the maximum */ |
830 | DV_SET(offset, spi_max_offset(starget)); | 841 | DV_SET(offset, spi_max_offset(starget)); |
831 | DV_SET(period, spi_min_period(starget)); | 842 | DV_SET(period, min_period); |
843 | |||
832 | /* try QAS requests; this should be harmless to set if the | 844 | /* try QAS requests; this should be harmless to set if the |
833 | * target supports it */ | 845 | * target supports it */ |
834 | if (scsi_device_qas(sdev)) { | 846 | if (scsi_device_qas(sdev)) { |
@@ -837,14 +849,14 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) | |||
837 | DV_SET(qas, 0); | 849 | DV_SET(qas, 0); |
838 | } | 850 | } |
839 | 851 | ||
840 | if (scsi_device_ius(sdev) && spi_min_period(starget) < 9) { | 852 | if (scsi_device_ius(sdev) && min_period < 9) { |
841 | /* This u320 (or u640). Set IU transfers */ | 853 | /* This u320 (or u640). Set IU transfers */ |
842 | DV_SET(iu, 1); | 854 | DV_SET(iu, 1); |
843 | /* Then set the optional parameters */ | 855 | /* Then set the optional parameters */ |
844 | DV_SET(rd_strm, 1); | 856 | DV_SET(rd_strm, 1); |
845 | DV_SET(wr_flow, 1); | 857 | DV_SET(wr_flow, 1); |
846 | DV_SET(rti, 1); | 858 | DV_SET(rti, 1); |
847 | if (spi_min_period(starget) == 8) | 859 | if (min_period == 8) |
848 | DV_SET(pcomp_en, 1); | 860 | DV_SET(pcomp_en, 1); |
849 | } else { | 861 | } else { |
850 | DV_SET(iu, 0); | 862 | DV_SET(iu, 0); |
@@ -862,6 +874,10 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) | |||
862 | } else { | 874 | } else { |
863 | DV_SET(dt, 1); | 875 | DV_SET(dt, 1); |
864 | } | 876 | } |
877 | /* set width last because it will pull all the other | ||
878 | * parameters down to required values */ | ||
879 | DV_SET(width, max_width); | ||
880 | |||
865 | /* Do the read only INQUIRY tests */ | 881 | /* Do the read only INQUIRY tests */ |
866 | spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len, | 882 | spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len, |
867 | spi_dv_device_compare_inquiry); | 883 | spi_dv_device_compare_inquiry); |
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 8d7ab74170d5..a593f900eff4 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c | |||
@@ -431,6 +431,7 @@ static int w1_uevent(struct device *dev, char **envp, int num_envp, | |||
431 | err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, | 431 | err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, |
432 | &cur_len, "W1_SLAVE_ID=%024LX", | 432 | &cur_len, "W1_SLAVE_ID=%024LX", |
433 | (unsigned long long)sl->reg_num.id); | 433 | (unsigned long long)sl->reg_num.id); |
434 | envp[cur_index] = NULL; | ||
434 | if (err) | 435 | if (err) |
435 | return err; | 436 | return err; |
436 | 437 | ||