diff options
Diffstat (limited to 'drivers')
52 files changed, 632 insertions, 187 deletions
diff --git a/drivers/base/iommu.c b/drivers/base/iommu.c index 9f0e672f4be8..8ad4ffea6920 100644 --- a/drivers/base/iommu.c +++ b/drivers/base/iommu.c | |||
@@ -18,6 +18,8 @@ | |||
18 | 18 | ||
19 | #include <linux/bug.h> | 19 | #include <linux/bug.h> |
20 | #include <linux/types.h> | 20 | #include <linux/types.h> |
21 | #include <linux/module.h> | ||
22 | #include <linux/slab.h> | ||
21 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
22 | #include <linux/iommu.h> | 24 | #include <linux/iommu.h> |
23 | 25 | ||
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index a2dee0eb6dad..e6ce632a393e 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
@@ -400,6 +400,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
400 | case KIOCSOUND: | 400 | case KIOCSOUND: |
401 | if (!perm) | 401 | if (!perm) |
402 | goto eperm; | 402 | goto eperm; |
403 | /* FIXME: This is an old broken API but we need to keep it | ||
404 | supported and somehow separate the historic advertised | ||
405 | tick rate from any real one */ | ||
403 | if (arg) | 406 | if (arg) |
404 | arg = CLOCK_TICK_RATE / arg; | 407 | arg = CLOCK_TICK_RATE / arg; |
405 | kd_mksound(arg, 0); | 408 | kd_mksound(arg, 0); |
@@ -417,6 +420,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
417 | */ | 420 | */ |
418 | ticks = HZ * ((arg >> 16) & 0xffff) / 1000; | 421 | ticks = HZ * ((arg >> 16) & 0xffff) / 1000; |
419 | count = ticks ? (arg & 0xffff) : 0; | 422 | count = ticks ? (arg & 0xffff) : 0; |
423 | /* FIXME: This is an old broken API but we need to keep it | ||
424 | supported and somehow separate the historic advertised | ||
425 | tick rate from any real one */ | ||
420 | if (count) | 426 | if (count) |
421 | count = CLOCK_TICK_RATE / count; | 427 | count = CLOCK_TICK_RATE / count; |
422 | kd_mksound(count, ticks); | 428 | kd_mksound(count, ticks); |
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index a04639dc633d..45890447feec 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
@@ -561,7 +561,6 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | |||
561 | int saved_x, saved_y; | 561 | int saved_x, saved_y; |
562 | struct drm_encoder *encoder; | 562 | struct drm_encoder *encoder; |
563 | bool ret = true; | 563 | bool ret = true; |
564 | bool depth_changed, bpp_changed; | ||
565 | 564 | ||
566 | adjusted_mode = drm_mode_duplicate(dev, mode); | 565 | adjusted_mode = drm_mode_duplicate(dev, mode); |
567 | 566 | ||
@@ -570,15 +569,6 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | |||
570 | if (!crtc->enabled) | 569 | if (!crtc->enabled) |
571 | return true; | 570 | return true; |
572 | 571 | ||
573 | if (old_fb && crtc->fb) { | ||
574 | depth_changed = (old_fb->depth != crtc->fb->depth); | ||
575 | bpp_changed = (old_fb->bits_per_pixel != | ||
576 | crtc->fb->bits_per_pixel); | ||
577 | } else { | ||
578 | depth_changed = true; | ||
579 | bpp_changed = true; | ||
580 | } | ||
581 | |||
582 | saved_mode = crtc->mode; | 572 | saved_mode = crtc->mode; |
583 | saved_x = crtc->x; | 573 | saved_x = crtc->x; |
584 | saved_y = crtc->y; | 574 | saved_y = crtc->y; |
@@ -590,15 +580,6 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | |||
590 | crtc->x = x; | 580 | crtc->x = x; |
591 | crtc->y = y; | 581 | crtc->y = y; |
592 | 582 | ||
593 | if (drm_mode_equal(&saved_mode, &crtc->mode)) { | ||
594 | if (saved_x != crtc->x || saved_y != crtc->y || | ||
595 | depth_changed || bpp_changed) { | ||
596 | ret = !crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, | ||
597 | old_fb); | ||
598 | goto done; | ||
599 | } | ||
600 | } | ||
601 | |||
602 | /* Pass our mode to the connectors and the CRTC to give them a chance to | 583 | /* Pass our mode to the connectors and the CRTC to give them a chance to |
603 | * adjust it according to limitations or connector properties, and also | 584 | * adjust it according to limitations or connector properties, and also |
604 | * a chance to reject the mode entirely. | 585 | * a chance to reject the mode entirely. |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index c4ada8b6295b..f01def16a669 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
@@ -456,7 +456,8 @@ int drm_ioctl(struct inode *inode, struct file *filp, | |||
456 | retcode = -EINVAL; | 456 | retcode = -EINVAL; |
457 | } else if (((ioctl->flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)) || | 457 | } else if (((ioctl->flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)) || |
458 | ((ioctl->flags & DRM_AUTH) && !file_priv->authenticated) || | 458 | ((ioctl->flags & DRM_AUTH) && !file_priv->authenticated) || |
459 | ((ioctl->flags & DRM_MASTER) && !file_priv->is_master)) { | 459 | ((ioctl->flags & DRM_MASTER) && !file_priv->is_master) || |
460 | (!(ioctl->flags & DRM_CONTROL_ALLOW) && (file_priv->minor->type == DRM_MINOR_CONTROL))) { | ||
460 | retcode = -EACCES; | 461 | retcode = -EACCES; |
461 | } else { | 462 | } else { |
462 | if (cmd & (IOC_IN | IOC_OUT)) { | 463 | if (cmd & (IOC_IN | IOC_OUT)) { |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index ef878615c49f..b9631e3a1ea6 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
@@ -402,14 +402,14 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | |||
402 | if (dev->driver->load) { | 402 | if (dev->driver->load) { |
403 | ret = dev->driver->load(dev, ent->driver_data); | 403 | ret = dev->driver->load(dev, ent->driver_data); |
404 | if (ret) | 404 | if (ret) |
405 | goto err_g3; | 405 | goto err_g4; |
406 | } | 406 | } |
407 | 407 | ||
408 | /* setup the grouping for the legacy output */ | 408 | /* setup the grouping for the legacy output */ |
409 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | 409 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
410 | ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); | 410 | ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); |
411 | if (ret) | 411 | if (ret) |
412 | goto err_g3; | 412 | goto err_g4; |
413 | } | 413 | } |
414 | 414 | ||
415 | list_add_tail(&dev->driver_item, &driver->device_list); | 415 | list_add_tail(&dev->driver_item, &driver->device_list); |
@@ -420,8 +420,11 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | |||
420 | 420 | ||
421 | return 0; | 421 | return 0; |
422 | 422 | ||
423 | err_g3: | 423 | err_g4: |
424 | drm_put_minor(&dev->primary); | 424 | drm_put_minor(&dev->primary); |
425 | err_g3: | ||
426 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
427 | drm_put_minor(&dev->control); | ||
425 | err_g2: | 428 | err_g2: |
426 | pci_disable_device(pdev); | 429 | pci_disable_device(pdev); |
427 | err_g1: | 430 | err_g1: |
@@ -502,11 +505,11 @@ void drm_put_dev(struct drm_device *dev) | |||
502 | dev->agp = NULL; | 505 | dev->agp = NULL; |
503 | } | 506 | } |
504 | 507 | ||
505 | drm_ht_remove(&dev->map_hash); | ||
506 | drm_ctxbitmap_cleanup(dev); | ||
507 | |||
508 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) | 508 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) |
509 | drm_rmmap(dev, r_list->map); | 509 | drm_rmmap(dev, r_list->map); |
510 | drm_ht_remove(&dev->map_hash); | ||
511 | |||
512 | drm_ctxbitmap_cleanup(dev); | ||
510 | 513 | ||
511 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 514 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
512 | drm_put_minor(&dev->control); | 515 | drm_put_minor(&dev->control); |
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c index 022876ae34f0..8f9372921f82 100644 --- a/drivers/gpu/drm/drm_sysfs.c +++ b/drivers/gpu/drm/drm_sysfs.c | |||
@@ -489,9 +489,7 @@ int drm_sysfs_device_add(struct drm_minor *minor) | |||
489 | 489 | ||
490 | return 0; | 490 | return 0; |
491 | 491 | ||
492 | device_unregister(&minor->kdev); | ||
493 | err_out: | 492 | err_out: |
494 | |||
495 | return err; | 493 | return err; |
496 | } | 494 | } |
497 | 495 | ||
diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c index 32de4cedc363..077c0455a6b9 100644 --- a/drivers/gpu/drm/r128/r128_cce.c +++ b/drivers/gpu/drm/r128/r128_cce.c | |||
@@ -511,9 +511,9 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init) | |||
511 | 511 | ||
512 | #if __OS_HAS_AGP | 512 | #if __OS_HAS_AGP |
513 | if (!dev_priv->is_pci) { | 513 | if (!dev_priv->is_pci) { |
514 | drm_core_ioremap(dev_priv->cce_ring, dev); | 514 | drm_core_ioremap_wc(dev_priv->cce_ring, dev); |
515 | drm_core_ioremap(dev_priv->ring_rptr, dev); | 515 | drm_core_ioremap_wc(dev_priv->ring_rptr, dev); |
516 | drm_core_ioremap(dev->agp_buffer_map, dev); | 516 | drm_core_ioremap_wc(dev->agp_buffer_map, dev); |
517 | if (!dev_priv->cce_ring->handle || | 517 | if (!dev_priv->cce_ring->handle || |
518 | !dev_priv->ring_rptr->handle || | 518 | !dev_priv->ring_rptr->handle || |
519 | !dev->agp_buffer_map->handle) { | 519 | !dev->agp_buffer_map->handle) { |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index ed4d27e6ee6f..8071d965f142 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
@@ -99,9 +99,10 @@ | |||
99 | * 1.27- Add support for IGP GART | 99 | * 1.27- Add support for IGP GART |
100 | * 1.28- Add support for VBL on CRTC2 | 100 | * 1.28- Add support for VBL on CRTC2 |
101 | * 1.29- R500 3D cmd buffer support | 101 | * 1.29- R500 3D cmd buffer support |
102 | * 1.30- Add support for occlusion queries | ||
102 | */ | 103 | */ |
103 | #define DRIVER_MAJOR 1 | 104 | #define DRIVER_MAJOR 1 |
104 | #define DRIVER_MINOR 29 | 105 | #define DRIVER_MINOR 30 |
105 | #define DRIVER_PATCHLEVEL 0 | 106 | #define DRIVER_PATCHLEVEL 0 |
106 | 107 | ||
107 | /* | 108 | /* |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index d420cc5f5633..e25e13980af3 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -104,7 +104,7 @@ static int sclhi(struct i2c_algo_bit_data *adap) | |||
104 | * chips may hold it low ("clock stretching") while they | 104 | * chips may hold it low ("clock stretching") while they |
105 | * are processing data internally. | 105 | * are processing data internally. |
106 | */ | 106 | */ |
107 | if (time_after_eq(jiffies, start + adap->timeout)) | 107 | if (time_after(jiffies, start + adap->timeout)) |
108 | return -ETIMEDOUT; | 108 | return -ETIMEDOUT; |
109 | cond_resched(); | 109 | cond_resched(); |
110 | } | 110 | } |
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 6318f7ddc1d4..78d42aae0089 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
@@ -287,10 +287,21 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
287 | 287 | ||
288 | case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */ | 288 | case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */ |
289 | DEB2("NOT ACK received after data byte\n"); | 289 | DEB2("NOT ACK received after data byte\n"); |
290 | pca_stop(adap); | ||
290 | goto out; | 291 | goto out; |
291 | 292 | ||
292 | case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */ | 293 | case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */ |
293 | DEB2("Arbitration lost\n"); | 294 | DEB2("Arbitration lost\n"); |
295 | /* | ||
296 | * The PCA9564 data sheet (2006-09-01) says "A | ||
297 | * START condition will be transmitted when the | ||
298 | * bus becomes free (STOP or SCL and SDA high)" | ||
299 | * when the STA bit is set (p. 11). | ||
300 | * | ||
301 | * In case this won't work, try pca_reset() | ||
302 | * instead. | ||
303 | */ | ||
304 | pca_start(adap); | ||
294 | goto out; | 305 | goto out; |
295 | 306 | ||
296 | case 0x58: /* Data byte has been received; NOT ACK has been returned */ | 307 | case 0x58: /* Data byte has been received; NOT ACK has been returned */ |
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c index 981e080b32ae..d108450df064 100644 --- a/drivers/i2c/busses/i2c-ali1535.c +++ b/drivers/i2c/busses/i2c-ali1535.c | |||
@@ -284,7 +284,7 @@ static int ali1535_transaction(struct i2c_adapter *adap) | |||
284 | && (timeout++ < MAX_TIMEOUT)); | 284 | && (timeout++ < MAX_TIMEOUT)); |
285 | 285 | ||
286 | /* If the SMBus is still busy, we give up */ | 286 | /* If the SMBus is still busy, we give up */ |
287 | if (timeout >= MAX_TIMEOUT) { | 287 | if (timeout > MAX_TIMEOUT) { |
288 | result = -ETIMEDOUT; | 288 | result = -ETIMEDOUT; |
289 | dev_err(&adap->dev, "SMBus Timeout!\n"); | 289 | dev_err(&adap->dev, "SMBus Timeout!\n"); |
290 | } | 290 | } |
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c index 39066dee46e3..d627fceb790b 100644 --- a/drivers/i2c/busses/i2c-ali15x3.c +++ b/drivers/i2c/busses/i2c-ali15x3.c | |||
@@ -306,7 +306,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap) | |||
306 | && (timeout++ < MAX_TIMEOUT)); | 306 | && (timeout++ < MAX_TIMEOUT)); |
307 | 307 | ||
308 | /* If the SMBus is still busy, we give up */ | 308 | /* If the SMBus is still busy, we give up */ |
309 | if (timeout >= MAX_TIMEOUT) { | 309 | if (timeout > MAX_TIMEOUT) { |
310 | result = -ETIMEDOUT; | 310 | result = -ETIMEDOUT; |
311 | dev_err(&adap->dev, "SMBus Timeout!\n"); | 311 | dev_err(&adap->dev, "SMBus Timeout!\n"); |
312 | } | 312 | } |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 220f4a1eee1d..f7d6fe9c49ba 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
@@ -126,7 +126,7 @@ static int amd756_transaction(struct i2c_adapter *adap) | |||
126 | } while ((temp & (GS_HST_STS | GS_SMB_STS)) && | 126 | } while ((temp & (GS_HST_STS | GS_SMB_STS)) && |
127 | (timeout++ < MAX_TIMEOUT)); | 127 | (timeout++ < MAX_TIMEOUT)); |
128 | /* If the SMBus is still busy, we give up */ | 128 | /* If the SMBus is still busy, we give up */ |
129 | if (timeout >= MAX_TIMEOUT) { | 129 | if (timeout > MAX_TIMEOUT) { |
130 | dev_dbg(&adap->dev, "Busy wait timeout (%04x)\n", temp); | 130 | dev_dbg(&adap->dev, "Busy wait timeout (%04x)\n", temp); |
131 | goto abort; | 131 | goto abort; |
132 | } | 132 | } |
@@ -143,7 +143,7 @@ static int amd756_transaction(struct i2c_adapter *adap) | |||
143 | } while ((temp & GS_HST_STS) && (timeout++ < MAX_TIMEOUT)); | 143 | } while ((temp & GS_HST_STS) && (timeout++ < MAX_TIMEOUT)); |
144 | 144 | ||
145 | /* If the SMBus is still busy, we give up */ | 145 | /* If the SMBus is still busy, we give up */ |
146 | if (timeout >= MAX_TIMEOUT) { | 146 | if (timeout > MAX_TIMEOUT) { |
147 | dev_dbg(&adap->dev, "Completion timeout!\n"); | 147 | dev_dbg(&adap->dev, "Completion timeout!\n"); |
148 | goto abort; | 148 | goto abort; |
149 | } | 149 | } |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 10411848fd70..9d2c5adf5d4f 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -237,7 +237,7 @@ static int i801_transaction(int xact) | |||
237 | status = inb_p(SMBHSTSTS); | 237 | status = inb_p(SMBHSTSTS); |
238 | } while ((status & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT)); | 238 | } while ((status & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT)); |
239 | 239 | ||
240 | result = i801_check_post(status, timeout >= MAX_TIMEOUT); | 240 | result = i801_check_post(status, timeout > MAX_TIMEOUT); |
241 | if (result < 0) | 241 | if (result < 0) |
242 | return result; | 242 | return result; |
243 | 243 | ||
@@ -257,9 +257,9 @@ static void i801_wait_hwpec(void) | |||
257 | } while ((!(status & SMBHSTSTS_INTR)) | 257 | } while ((!(status & SMBHSTSTS_INTR)) |
258 | && (timeout++ < MAX_TIMEOUT)); | 258 | && (timeout++ < MAX_TIMEOUT)); |
259 | 259 | ||
260 | if (timeout >= MAX_TIMEOUT) { | 260 | if (timeout > MAX_TIMEOUT) |
261 | dev_dbg(&I801_dev->dev, "PEC Timeout!\n"); | 261 | dev_dbg(&I801_dev->dev, "PEC Timeout!\n"); |
262 | } | 262 | |
263 | outb_p(status, SMBHSTSTS); | 263 | outb_p(status, SMBHSTSTS); |
264 | } | 264 | } |
265 | 265 | ||
@@ -344,7 +344,7 @@ static int i801_block_transaction_byte_by_byte(union i2c_smbus_data *data, | |||
344 | while ((!(status & SMBHSTSTS_BYTE_DONE)) | 344 | while ((!(status & SMBHSTSTS_BYTE_DONE)) |
345 | && (timeout++ < MAX_TIMEOUT)); | 345 | && (timeout++ < MAX_TIMEOUT)); |
346 | 346 | ||
347 | result = i801_check_post(status, timeout >= MAX_TIMEOUT); | 347 | result = i801_check_post(status, timeout > MAX_TIMEOUT); |
348 | if (result < 0) | 348 | if (result < 0) |
349 | return result; | 349 | return result; |
350 | 350 | ||
diff --git a/drivers/i2c/busses/i2c-isch.c b/drivers/i2c/busses/i2c-isch.c index b9c01aa90036..9f6b8e0f8632 100644 --- a/drivers/i2c/busses/i2c-isch.c +++ b/drivers/i2c/busses/i2c-isch.c | |||
@@ -112,7 +112,7 @@ static int sch_transaction(void) | |||
112 | } while ((temp & 0x08) && (timeout++ < MAX_TIMEOUT)); | 112 | } while ((temp & 0x08) && (timeout++ < MAX_TIMEOUT)); |
113 | 113 | ||
114 | /* If the SMBus is still busy, we give up */ | 114 | /* If the SMBus is still busy, we give up */ |
115 | if (timeout >= MAX_TIMEOUT) { | 115 | if (timeout > MAX_TIMEOUT) { |
116 | dev_err(&sch_adapter.dev, "SMBus Timeout!\n"); | 116 | dev_err(&sch_adapter.dev, "SMBus Timeout!\n"); |
117 | result = -ETIMEDOUT; | 117 | result = -ETIMEDOUT; |
118 | } | 118 | } |
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c index 2ff4683703a8..ec11d1c4e77b 100644 --- a/drivers/i2c/busses/i2c-nforce2.c +++ b/drivers/i2c/busses/i2c-nforce2.c | |||
@@ -173,7 +173,7 @@ static int nforce2_check_status(struct i2c_adapter *adap) | |||
173 | temp = inb_p(NVIDIA_SMB_STS); | 173 | temp = inb_p(NVIDIA_SMB_STS); |
174 | } while ((!temp) && (timeout++ < MAX_TIMEOUT)); | 174 | } while ((!temp) && (timeout++ < MAX_TIMEOUT)); |
175 | 175 | ||
176 | if (timeout >= MAX_TIMEOUT) { | 176 | if (timeout > MAX_TIMEOUT) { |
177 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); | 177 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); |
178 | if (smbus->can_abort) | 178 | if (smbus->can_abort) |
179 | nforce2_abort(adap); | 179 | nforce2_abort(adap); |
diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index f320ab27da46..139f0c7f12a4 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c | |||
@@ -256,7 +256,7 @@ static int sis5595_transaction(struct i2c_adapter *adap) | |||
256 | } while (!(temp & 0x40) && (timeout++ < MAX_TIMEOUT)); | 256 | } while (!(temp & 0x40) && (timeout++ < MAX_TIMEOUT)); |
257 | 257 | ||
258 | /* If the SMBus is still busy, we give up */ | 258 | /* If the SMBus is still busy, we give up */ |
259 | if (timeout >= MAX_TIMEOUT) { | 259 | if (timeout > MAX_TIMEOUT) { |
260 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); | 260 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); |
261 | result = -ETIMEDOUT; | 261 | result = -ETIMEDOUT; |
262 | } | 262 | } |
diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index 50c3610e6028..70ca41e90e58 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c | |||
@@ -173,7 +173,7 @@ static int sis630_transaction_wait(struct i2c_adapter *adap, int size) | |||
173 | } while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT)); | 173 | } while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT)); |
174 | 174 | ||
175 | /* If the SMBus is still busy, we give up */ | 175 | /* If the SMBus is still busy, we give up */ |
176 | if (timeout >= MAX_TIMEOUT) { | 176 | if (timeout > MAX_TIMEOUT) { |
177 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); | 177 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); |
178 | result = -ETIMEDOUT; | 178 | result = -ETIMEDOUT; |
179 | } | 179 | } |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index 7e1594b40579..8295885b2fdb 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
@@ -132,7 +132,7 @@ static int sis96x_transaction(int size) | |||
132 | } while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT)); | 132 | } while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT)); |
133 | 133 | ||
134 | /* If the SMBus is still busy, we give up */ | 134 | /* If the SMBus is still busy, we give up */ |
135 | if (timeout >= MAX_TIMEOUT) { | 135 | if (timeout > MAX_TIMEOUT) { |
136 | dev_dbg(&sis96x_adapter.dev, "SMBus Timeout! (0x%02x)\n", temp); | 136 | dev_dbg(&sis96x_adapter.dev, "SMBus Timeout! (0x%02x)\n", temp); |
137 | result = -ETIMEDOUT; | 137 | result = -ETIMEDOUT; |
138 | } | 138 | } |
diff --git a/drivers/misc/isl29003.c b/drivers/misc/isl29003.c index 2e2a5923d4c2..a71e245801ee 100644 --- a/drivers/misc/isl29003.c +++ b/drivers/misc/isl29003.c | |||
@@ -64,6 +64,7 @@ struct isl29003_data { | |||
64 | struct i2c_client *client; | 64 | struct i2c_client *client; |
65 | struct mutex lock; | 65 | struct mutex lock; |
66 | u8 reg_cache[ISL29003_NUM_CACHABLE_REGS]; | 66 | u8 reg_cache[ISL29003_NUM_CACHABLE_REGS]; |
67 | u8 power_state_before_suspend; | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | static int gain_range[] = { | 70 | static int gain_range[] = { |
@@ -411,6 +412,9 @@ static int __devexit isl29003_remove(struct i2c_client *client) | |||
411 | #ifdef CONFIG_PM | 412 | #ifdef CONFIG_PM |
412 | static int isl29003_suspend(struct i2c_client *client, pm_message_t mesg) | 413 | static int isl29003_suspend(struct i2c_client *client, pm_message_t mesg) |
413 | { | 414 | { |
415 | struct isl29003_data *data = i2c_get_clientdata(client); | ||
416 | |||
417 | data->power_state_before_suspend = isl29003_get_power_state(client); | ||
414 | return isl29003_set_power_state(client, 0); | 418 | return isl29003_set_power_state(client, 0); |
415 | } | 419 | } |
416 | 420 | ||
@@ -421,10 +425,11 @@ static int isl29003_resume(struct i2c_client *client) | |||
421 | 425 | ||
422 | /* restore registers from cache */ | 426 | /* restore registers from cache */ |
423 | for (i = 0; i < ARRAY_SIZE(data->reg_cache); i++) | 427 | for (i = 0; i < ARRAY_SIZE(data->reg_cache); i++) |
424 | if (!i2c_smbus_write_byte_data(client, i, data->reg_cache[i])) | 428 | if (i2c_smbus_write_byte_data(client, i, data->reg_cache[i])) |
425 | return -EIO; | 429 | return -EIO; |
426 | 430 | ||
427 | return 0; | 431 | return isl29003_set_power_state(client, |
432 | data->power_state_before_suspend); | ||
428 | } | 433 | } |
429 | 434 | ||
430 | #else | 435 | #else |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index fe8041e619ea..b25e9b6516ae 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -254,6 +254,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
254 | brq.data.blocks = req->nr_sectors; | 254 | brq.data.blocks = req->nr_sectors; |
255 | 255 | ||
256 | /* | 256 | /* |
257 | * The block layer doesn't support all sector count | ||
258 | * restrictions, so we need to be prepared for too big | ||
259 | * requests. | ||
260 | */ | ||
261 | if (brq.data.blocks > card->host->max_blk_count) | ||
262 | brq.data.blocks = card->host->max_blk_count; | ||
263 | |||
264 | /* | ||
257 | * After a read error, we redo the request one sector at a time | 265 | * After a read error, we redo the request one sector at a time |
258 | * in order to accurately determine which sectors can be read | 266 | * in order to accurately determine which sectors can be read |
259 | * successfully. | 267 | * successfully. |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index fa073ab3fa34..264911732756 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -706,7 +706,7 @@ static void mmc_power_up(struct mmc_host *host) | |||
706 | * This delay should be sufficient to allow the power supply | 706 | * This delay should be sufficient to allow the power supply |
707 | * to reach the minimum voltage. | 707 | * to reach the minimum voltage. |
708 | */ | 708 | */ |
709 | mmc_delay(2); | 709 | mmc_delay(10); |
710 | 710 | ||
711 | host->ios.clock = host->f_min; | 711 | host->ios.clock = host->f_min; |
712 | host->ios.power_mode = MMC_POWER_ON; | 712 | host->ios.power_mode = MMC_POWER_ON; |
@@ -716,7 +716,7 @@ static void mmc_power_up(struct mmc_host *host) | |||
716 | * This delay must be at least 74 clock sizes, or 1 ms, or the | 716 | * This delay must be at least 74 clock sizes, or 1 ms, or the |
717 | * time required to reach a stable voltage. | 717 | * time required to reach a stable voltage. |
718 | */ | 718 | */ |
719 | mmc_delay(2); | 719 | mmc_delay(10); |
720 | } | 720 | } |
721 | 721 | ||
722 | static void mmc_power_off(struct mmc_host *host) | 722 | static void mmc_power_off(struct mmc_host *host) |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index a663429b3d55..36875dcfa492 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -514,6 +514,7 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id) | |||
514 | } | 514 | } |
515 | 515 | ||
516 | host = mmc_priv(mmc); | 516 | host = mmc_priv(mmc); |
517 | host->mmc = mmc; | ||
517 | /* Bits 12 thru 19 is the designer */ | 518 | /* Bits 12 thru 19 is the designer */ |
518 | host->hw_designer = (dev->periphid >> 12) & 0xff; | 519 | host->hw_designer = (dev->periphid >> 12) & 0xff; |
519 | /* Bits 20 thru 23 is the revison */ | 520 | /* Bits 20 thru 23 is the revison */ |
@@ -545,7 +546,6 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id) | |||
545 | host->mclk = clk_get_rate(host->clk); | 546 | host->mclk = clk_get_rate(host->clk); |
546 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); | 547 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); |
547 | } | 548 | } |
548 | host->mmc = mmc; | ||
549 | host->base = ioremap(dev->res.start, SZ_4K); | 549 | host->base = ioremap(dev->res.start, SZ_4K); |
550 | if (!host->base) { | 550 | if (!host->base) { |
551 | ret = -ENOMEM; | 551 | ret = -ENOMEM; |
diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c index b5c375d94ab3..c643d0fe118f 100644 --- a/drivers/mmc/host/mvsdio.c +++ b/drivers/mmc/host/mvsdio.c | |||
@@ -825,24 +825,23 @@ static int __exit mvsd_remove(struct platform_device *pdev) | |||
825 | } | 825 | } |
826 | 826 | ||
827 | #ifdef CONFIG_PM | 827 | #ifdef CONFIG_PM |
828 | static int mvsd_suspend(struct platform_device *dev, pm_message_t state, | 828 | static int mvsd_suspend(struct platform_device *dev, pm_message_t state) |
829 | u32 level) | ||
830 | { | 829 | { |
831 | struct mmc_host *mmc = platform_get_drvdata(dev); | 830 | struct mmc_host *mmc = platform_get_drvdata(dev); |
832 | int ret = 0; | 831 | int ret = 0; |
833 | 832 | ||
834 | if (mmc && level == SUSPEND_DISABLE) | 833 | if (mmc) |
835 | ret = mmc_suspend_host(mmc, state); | 834 | ret = mmc_suspend_host(mmc, state); |
836 | 835 | ||
837 | return ret; | 836 | return ret; |
838 | } | 837 | } |
839 | 838 | ||
840 | static int mvsd_resume(struct platform_device *dev, u32 level) | 839 | static int mvsd_resume(struct platform_device *dev) |
841 | { | 840 | { |
842 | struct mmc_host *mmc = platform_dev_get_drvdata(dev); | 841 | struct mmc_host *mmc = platform_get_drvdata(dev); |
843 | int ret = 0; | 842 | int ret = 0; |
844 | 843 | ||
845 | if (mmc && level == RESUME_ENABLE) | 844 | if (mmc) |
846 | ret = mmc_resume_host(mmc); | 845 | ret = mmc_resume_host(mmc); |
847 | 846 | ||
848 | return ret; | 847 | return ret; |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index cd37962ec44f..65be27995d5c 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
@@ -522,8 +522,8 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( | |||
522 | 522 | ||
523 | host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_pci_slot)); | 523 | host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_pci_slot)); |
524 | if (IS_ERR(host)) { | 524 | if (IS_ERR(host)) { |
525 | ret = PTR_ERR(host); | 525 | dev_err(&pdev->dev, "cannot allocate host\n"); |
526 | goto unmap; | 526 | return ERR_PTR(PTR_ERR(host)); |
527 | } | 527 | } |
528 | 528 | ||
529 | slot = sdhci_priv(host); | 529 | slot = sdhci_priv(host); |
@@ -541,7 +541,7 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( | |||
541 | ret = pci_request_region(pdev, bar, mmc_hostname(host->mmc)); | 541 | ret = pci_request_region(pdev, bar, mmc_hostname(host->mmc)); |
542 | if (ret) { | 542 | if (ret) { |
543 | dev_err(&pdev->dev, "cannot request region\n"); | 543 | dev_err(&pdev->dev, "cannot request region\n"); |
544 | return ERR_PTR(ret); | 544 | goto free; |
545 | } | 545 | } |
546 | 546 | ||
547 | addr = pci_resource_start(pdev, bar); | 547 | addr = pci_resource_start(pdev, bar); |
@@ -572,6 +572,8 @@ unmap: | |||
572 | 572 | ||
573 | release: | 573 | release: |
574 | pci_release_region(pdev, bar); | 574 | pci_release_region(pdev, bar); |
575 | |||
576 | free: | ||
575 | sdhci_free_host(host); | 577 | sdhci_free_host(host); |
576 | 578 | ||
577 | return ERR_PTR(ret); | 579 | return ERR_PTR(ret); |
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index f20a834f4309..65c6f996bbd3 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
@@ -125,7 +125,7 @@ | |||
125 | #define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \ | 125 | #define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \ |
126 | SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \ | 126 | SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \ |
127 | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \ | 127 | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \ |
128 | SDHCI_INT_DATA_END_BIT) | 128 | SDHCI_INT_DATA_END_BIT | SDHCI_ADMA_ERROR) |
129 | #define SDHCI_INT_ALL_MASK ((unsigned int)-1) | 129 | #define SDHCI_INT_ALL_MASK ((unsigned int)-1) |
130 | 130 | ||
131 | #define SDHCI_ACMD12_ERR 0x3C | 131 | #define SDHCI_ACMD12_ERR 0x3C |
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index 553a89919778..46d312bedfb8 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -1706,10 +1706,8 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave | |||
1706 | * Called with RTNL | 1706 | * Called with RTNL |
1707 | */ | 1707 | */ |
1708 | int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) | 1708 | int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) |
1709 | __releases(&bond->curr_slave_lock) | ||
1710 | __releases(&bond->lock) | ||
1711 | __acquires(&bond->lock) | 1709 | __acquires(&bond->lock) |
1712 | __acquires(&bond->curr_slave_lock) | 1710 | __releases(&bond->lock) |
1713 | { | 1711 | { |
1714 | struct bonding *bond = netdev_priv(bond_dev); | 1712 | struct bonding *bond = netdev_priv(bond_dev); |
1715 | struct sockaddr *sa = addr; | 1713 | struct sockaddr *sa = addr; |
@@ -1745,9 +1743,6 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) | |||
1745 | } | 1743 | } |
1746 | } | 1744 | } |
1747 | 1745 | ||
1748 | write_unlock_bh(&bond->curr_slave_lock); | ||
1749 | read_unlock(&bond->lock); | ||
1750 | |||
1751 | if (swap_slave) { | 1746 | if (swap_slave) { |
1752 | alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave); | 1747 | alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave); |
1753 | alb_fasten_mac_swap(bond, swap_slave, bond->curr_active_slave); | 1748 | alb_fasten_mac_swap(bond, swap_slave, bond->curr_active_slave); |
@@ -1755,16 +1750,15 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) | |||
1755 | alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr, | 1750 | alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr, |
1756 | bond->alb_info.rlb_enabled); | 1751 | bond->alb_info.rlb_enabled); |
1757 | 1752 | ||
1753 | read_lock(&bond->lock); | ||
1758 | alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); | 1754 | alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); |
1759 | if (bond->alb_info.rlb_enabled) { | 1755 | if (bond->alb_info.rlb_enabled) { |
1760 | /* inform clients mac address has changed */ | 1756 | /* inform clients mac address has changed */ |
1761 | rlb_req_update_slave_clients(bond, bond->curr_active_slave); | 1757 | rlb_req_update_slave_clients(bond, bond->curr_active_slave); |
1762 | } | 1758 | } |
1759 | read_unlock(&bond->lock); | ||
1763 | } | 1760 | } |
1764 | 1761 | ||
1765 | read_lock(&bond->lock); | ||
1766 | write_lock_bh(&bond->curr_slave_lock); | ||
1767 | |||
1768 | return 0; | 1762 | return 0; |
1769 | } | 1763 | } |
1770 | 1764 | ||
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 63369b6b14d4..2188a96fc090 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2213,33 +2213,24 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in | |||
2213 | { | 2213 | { |
2214 | struct bonding *bond = netdev_priv(bond_dev); | 2214 | struct bonding *bond = netdev_priv(bond_dev); |
2215 | struct slave *slave; | 2215 | struct slave *slave; |
2216 | int i, found = 0; | 2216 | int i, res = -ENODEV; |
2217 | |||
2218 | if (info->slave_id < 0) { | ||
2219 | return -ENODEV; | ||
2220 | } | ||
2221 | 2217 | ||
2222 | read_lock(&bond->lock); | 2218 | read_lock(&bond->lock); |
2223 | 2219 | ||
2224 | bond_for_each_slave(bond, slave, i) { | 2220 | bond_for_each_slave(bond, slave, i) { |
2225 | if (i == (int)info->slave_id) { | 2221 | if (i == (int)info->slave_id) { |
2226 | found = 1; | 2222 | res = 0; |
2223 | strcpy(info->slave_name, slave->dev->name); | ||
2224 | info->link = slave->link; | ||
2225 | info->state = slave->state; | ||
2226 | info->link_failure_count = slave->link_failure_count; | ||
2227 | break; | 2227 | break; |
2228 | } | 2228 | } |
2229 | } | 2229 | } |
2230 | 2230 | ||
2231 | read_unlock(&bond->lock); | 2231 | read_unlock(&bond->lock); |
2232 | 2232 | ||
2233 | if (found) { | 2233 | return res; |
2234 | strcpy(info->slave_name, slave->dev->name); | ||
2235 | info->link = slave->link; | ||
2236 | info->state = slave->state; | ||
2237 | info->link_failure_count = slave->link_failure_count; | ||
2238 | } else { | ||
2239 | return -ENODEV; | ||
2240 | } | ||
2241 | |||
2242 | return 0; | ||
2243 | } | 2234 | } |
2244 | 2235 | ||
2245 | /*-------------------------------- Monitoring -------------------------------*/ | 2236 | /*-------------------------------- Monitoring -------------------------------*/ |
@@ -5167,16 +5158,15 @@ int bond_create(char *name, struct bond_params *params) | |||
5167 | up_write(&bonding_rwsem); | 5158 | up_write(&bonding_rwsem); |
5168 | rtnl_unlock(); /* allows sysfs registration of net device */ | 5159 | rtnl_unlock(); /* allows sysfs registration of net device */ |
5169 | res = bond_create_sysfs_entry(netdev_priv(bond_dev)); | 5160 | res = bond_create_sysfs_entry(netdev_priv(bond_dev)); |
5170 | if (res < 0) { | 5161 | if (res < 0) |
5171 | rtnl_lock(); | 5162 | goto out_unreg; |
5172 | down_write(&bonding_rwsem); | ||
5173 | bond_deinit(bond_dev); | ||
5174 | unregister_netdevice(bond_dev); | ||
5175 | goto out_rtnl; | ||
5176 | } | ||
5177 | 5163 | ||
5178 | return 0; | 5164 | return 0; |
5179 | 5165 | ||
5166 | out_unreg: | ||
5167 | rtnl_lock(); | ||
5168 | down_write(&bonding_rwsem); | ||
5169 | unregister_netdevice(bond_dev); | ||
5180 | out_bond: | 5170 | out_bond: |
5181 | bond_deinit(bond_dev); | 5171 | bond_deinit(bond_dev); |
5182 | out_netdev: | 5172 | out_netdev: |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index e1bd690ff831..4f68aeb2679a 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -3779,7 +3779,7 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai, | |||
3779 | 3779 | ||
3780 | adapter->params.info = ai; | 3780 | adapter->params.info = ai; |
3781 | adapter->params.nports = ai->nports0 + ai->nports1; | 3781 | adapter->params.nports = ai->nports0 + ai->nports1; |
3782 | adapter->params.chan_map = !!ai->nports0 | (!!ai->nports1 << 1); | 3782 | adapter->params.chan_map = (!!ai->nports0) | (!!ai->nports1 << 1); |
3783 | adapter->params.rev = t3_read_reg(adapter, A_PL_REV); | 3783 | adapter->params.rev = t3_read_reg(adapter, A_PL_REV); |
3784 | /* | 3784 | /* |
3785 | * We used to only run the "adapter check task" once a second if | 3785 | * We used to only run the "adapter check task" once a second if |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 6a46ceed9436..b1419e21b46b 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -3738,7 +3738,7 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
3738 | struct e1000_hw *hw = &adapter->hw; | 3738 | struct e1000_hw *hw = &adapter->hw; |
3739 | u32 rctl, icr = er32(ICR); | 3739 | u32 rctl, icr = er32(ICR); |
3740 | 3740 | ||
3741 | if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags))) | 3741 | if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags))) |
3742 | return IRQ_NONE; /* Not our interrupt */ | 3742 | return IRQ_NONE; /* Not our interrupt */ |
3743 | 3743 | ||
3744 | /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is | 3744 | /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 6e317caf429c..16a41389575a 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | 41 | ||
42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
43 | #define DRV_VERSION "EHEA_0100" | 43 | #define DRV_VERSION "EHEA_0101" |
44 | 44 | ||
45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 604c844d0769..b22dab9153f6 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -545,14 +545,17 @@ static inline struct sk_buff *get_skb_by_index(struct sk_buff **skb_array, | |||
545 | x &= (arr_len - 1); | 545 | x &= (arr_len - 1); |
546 | 546 | ||
547 | pref = skb_array[x]; | 547 | pref = skb_array[x]; |
548 | prefetchw(pref); | 548 | if (pref) { |
549 | prefetchw(pref + EHEA_CACHE_LINE); | 549 | prefetchw(pref); |
550 | 550 | prefetchw(pref + EHEA_CACHE_LINE); | |
551 | pref = (skb_array[x]->data); | 551 | |
552 | prefetch(pref); | 552 | pref = (skb_array[x]->data); |
553 | prefetch(pref + EHEA_CACHE_LINE); | 553 | prefetch(pref); |
554 | prefetch(pref + EHEA_CACHE_LINE * 2); | 554 | prefetch(pref + EHEA_CACHE_LINE); |
555 | prefetch(pref + EHEA_CACHE_LINE * 3); | 555 | prefetch(pref + EHEA_CACHE_LINE * 2); |
556 | prefetch(pref + EHEA_CACHE_LINE * 3); | ||
557 | } | ||
558 | |||
556 | skb = skb_array[skb_index]; | 559 | skb = skb_array[skb_index]; |
557 | skb_array[skb_index] = NULL; | 560 | skb_array[skb_index] = NULL; |
558 | return skb; | 561 | return skb; |
@@ -569,12 +572,14 @@ static inline struct sk_buff *get_skb_by_index_ll(struct sk_buff **skb_array, | |||
569 | x &= (arr_len - 1); | 572 | x &= (arr_len - 1); |
570 | 573 | ||
571 | pref = skb_array[x]; | 574 | pref = skb_array[x]; |
572 | prefetchw(pref); | 575 | if (pref) { |
573 | prefetchw(pref + EHEA_CACHE_LINE); | 576 | prefetchw(pref); |
577 | prefetchw(pref + EHEA_CACHE_LINE); | ||
574 | 578 | ||
575 | pref = (skb_array[x]->data); | 579 | pref = (skb_array[x]->data); |
576 | prefetchw(pref); | 580 | prefetchw(pref); |
577 | prefetchw(pref + EHEA_CACHE_LINE); | 581 | prefetchw(pref + EHEA_CACHE_LINE); |
582 | } | ||
578 | 583 | ||
579 | skb = skb_array[wqe_index]; | 584 | skb = skb_array[wqe_index]; |
580 | skb_array[wqe_index] = NULL; | 585 | skb_array[wqe_index] = NULL; |
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index b3185bf2c158..a400d7115f78 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -393,12 +393,12 @@ struct mv643xx_eth_private { | |||
393 | struct work_struct tx_timeout_task; | 393 | struct work_struct tx_timeout_task; |
394 | 394 | ||
395 | struct napi_struct napi; | 395 | struct napi_struct napi; |
396 | u8 oom; | ||
396 | u8 work_link; | 397 | u8 work_link; |
397 | u8 work_tx; | 398 | u8 work_tx; |
398 | u8 work_tx_end; | 399 | u8 work_tx_end; |
399 | u8 work_rx; | 400 | u8 work_rx; |
400 | u8 work_rx_refill; | 401 | u8 work_rx_refill; |
401 | u8 work_rx_oom; | ||
402 | 402 | ||
403 | int skb_size; | 403 | int skb_size; |
404 | struct sk_buff_head rx_recycle; | 404 | struct sk_buff_head rx_recycle; |
@@ -661,7 +661,7 @@ static int rxq_refill(struct rx_queue *rxq, int budget) | |||
661 | dma_get_cache_alignment() - 1); | 661 | dma_get_cache_alignment() - 1); |
662 | 662 | ||
663 | if (skb == NULL) { | 663 | if (skb == NULL) { |
664 | mp->work_rx_oom |= 1 << rxq->index; | 664 | mp->oom = 1; |
665 | goto oom; | 665 | goto oom; |
666 | } | 666 | } |
667 | 667 | ||
@@ -1255,7 +1255,6 @@ static void mib_counters_update(struct mv643xx_eth_private *mp) | |||
1255 | 1255 | ||
1256 | spin_lock_bh(&mp->mib_counters_lock); | 1256 | spin_lock_bh(&mp->mib_counters_lock); |
1257 | p->good_octets_received += mib_read(mp, 0x00); | 1257 | p->good_octets_received += mib_read(mp, 0x00); |
1258 | p->good_octets_received += (u64)mib_read(mp, 0x04) << 32; | ||
1259 | p->bad_octets_received += mib_read(mp, 0x08); | 1258 | p->bad_octets_received += mib_read(mp, 0x08); |
1260 | p->internal_mac_transmit_err += mib_read(mp, 0x0c); | 1259 | p->internal_mac_transmit_err += mib_read(mp, 0x0c); |
1261 | p->good_frames_received += mib_read(mp, 0x10); | 1260 | p->good_frames_received += mib_read(mp, 0x10); |
@@ -1269,7 +1268,6 @@ static void mib_counters_update(struct mv643xx_eth_private *mp) | |||
1269 | p->frames_512_to_1023_octets += mib_read(mp, 0x30); | 1268 | p->frames_512_to_1023_octets += mib_read(mp, 0x30); |
1270 | p->frames_1024_to_max_octets += mib_read(mp, 0x34); | 1269 | p->frames_1024_to_max_octets += mib_read(mp, 0x34); |
1271 | p->good_octets_sent += mib_read(mp, 0x38); | 1270 | p->good_octets_sent += mib_read(mp, 0x38); |
1272 | p->good_octets_sent += (u64)mib_read(mp, 0x3c) << 32; | ||
1273 | p->good_frames_sent += mib_read(mp, 0x40); | 1271 | p->good_frames_sent += mib_read(mp, 0x40); |
1274 | p->excessive_collision += mib_read(mp, 0x44); | 1272 | p->excessive_collision += mib_read(mp, 0x44); |
1275 | p->multicast_frames_sent += mib_read(mp, 0x48); | 1273 | p->multicast_frames_sent += mib_read(mp, 0x48); |
@@ -2167,8 +2165,10 @@ static int mv643xx_eth_poll(struct napi_struct *napi, int budget) | |||
2167 | 2165 | ||
2168 | mp = container_of(napi, struct mv643xx_eth_private, napi); | 2166 | mp = container_of(napi, struct mv643xx_eth_private, napi); |
2169 | 2167 | ||
2170 | mp->work_rx_refill |= mp->work_rx_oom; | 2168 | if (unlikely(mp->oom)) { |
2171 | mp->work_rx_oom = 0; | 2169 | mp->oom = 0; |
2170 | del_timer(&mp->rx_oom); | ||
2171 | } | ||
2172 | 2172 | ||
2173 | work_done = 0; | 2173 | work_done = 0; |
2174 | while (work_done < budget) { | 2174 | while (work_done < budget) { |
@@ -2182,8 +2182,10 @@ static int mv643xx_eth_poll(struct napi_struct *napi, int budget) | |||
2182 | continue; | 2182 | continue; |
2183 | } | 2183 | } |
2184 | 2184 | ||
2185 | queue_mask = mp->work_tx | mp->work_tx_end | | 2185 | queue_mask = mp->work_tx | mp->work_tx_end | mp->work_rx; |
2186 | mp->work_rx | mp->work_rx_refill; | 2186 | if (likely(!mp->oom)) |
2187 | queue_mask |= mp->work_rx_refill; | ||
2188 | |||
2187 | if (!queue_mask) { | 2189 | if (!queue_mask) { |
2188 | if (mv643xx_eth_collect_events(mp)) | 2190 | if (mv643xx_eth_collect_events(mp)) |
2189 | continue; | 2191 | continue; |
@@ -2204,7 +2206,7 @@ static int mv643xx_eth_poll(struct napi_struct *napi, int budget) | |||
2204 | txq_maybe_wake(mp->txq + queue); | 2206 | txq_maybe_wake(mp->txq + queue); |
2205 | } else if (mp->work_rx & queue_mask) { | 2207 | } else if (mp->work_rx & queue_mask) { |
2206 | work_done += rxq_process(mp->rxq + queue, work_tbd); | 2208 | work_done += rxq_process(mp->rxq + queue, work_tbd); |
2207 | } else if (mp->work_rx_refill & queue_mask) { | 2209 | } else if (!mp->oom && (mp->work_rx_refill & queue_mask)) { |
2208 | work_done += rxq_refill(mp->rxq + queue, work_tbd); | 2210 | work_done += rxq_refill(mp->rxq + queue, work_tbd); |
2209 | } else { | 2211 | } else { |
2210 | BUG(); | 2212 | BUG(); |
@@ -2212,7 +2214,7 @@ static int mv643xx_eth_poll(struct napi_struct *napi, int budget) | |||
2212 | } | 2214 | } |
2213 | 2215 | ||
2214 | if (work_done < budget) { | 2216 | if (work_done < budget) { |
2215 | if (mp->work_rx_oom) | 2217 | if (mp->oom) |
2216 | mod_timer(&mp->rx_oom, jiffies + (HZ / 10)); | 2218 | mod_timer(&mp->rx_oom, jiffies + (HZ / 10)); |
2217 | napi_complete(napi); | 2219 | napi_complete(napi); |
2218 | wrlp(mp, INT_MASK, INT_TX_END | INT_RX | INT_EXT); | 2220 | wrlp(mp, INT_MASK, INT_TX_END | INT_RX | INT_EXT); |
@@ -2372,7 +2374,7 @@ static int mv643xx_eth_open(struct net_device *dev) | |||
2372 | rxq_refill(mp->rxq + i, INT_MAX); | 2374 | rxq_refill(mp->rxq + i, INT_MAX); |
2373 | } | 2375 | } |
2374 | 2376 | ||
2375 | if (mp->work_rx_oom) { | 2377 | if (mp->oom) { |
2376 | mp->rx_oom.expires = jiffies + (HZ / 10); | 2378 | mp->rx_oom.expires = jiffies + (HZ / 10); |
2377 | add_timer(&mp->rx_oom); | 2379 | add_timer(&mp->rx_oom); |
2378 | } | 2380 | } |
diff --git a/drivers/net/ne2k-pci.c b/drivers/net/ne2k-pci.c index eb66f658f9d1..7d83896b8c26 100644 --- a/drivers/net/ne2k-pci.c +++ b/drivers/net/ne2k-pci.c | |||
@@ -374,18 +374,17 @@ static int __devinit ne2k_pci_init_one (struct pci_dev *pdev, | |||
374 | dev->ethtool_ops = &ne2k_pci_ethtool_ops; | 374 | dev->ethtool_ops = &ne2k_pci_ethtool_ops; |
375 | NS8390_init(dev, 0); | 375 | NS8390_init(dev, 0); |
376 | 376 | ||
377 | memcpy(dev->dev_addr, SA_prom, 6); | ||
378 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
379 | |||
377 | i = register_netdev(dev); | 380 | i = register_netdev(dev); |
378 | if (i) | 381 | if (i) |
379 | goto err_out_free_netdev; | 382 | goto err_out_free_netdev; |
380 | 383 | ||
381 | for(i = 0; i < 6; i++) | ||
382 | dev->dev_addr[i] = SA_prom[i]; | ||
383 | printk("%s: %s found at %#lx, IRQ %d, %pM.\n", | 384 | printk("%s: %s found at %#lx, IRQ %d, %pM.\n", |
384 | dev->name, pci_clone_list[chip_idx].name, ioaddr, dev->irq, | 385 | dev->name, pci_clone_list[chip_idx].name, ioaddr, dev->irq, |
385 | dev->dev_addr); | 386 | dev->dev_addr); |
386 | 387 | ||
387 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
388 | |||
389 | return 0; | 388 | return 0; |
390 | 389 | ||
391 | err_out_free_netdev: | 390 | err_out_free_netdev: |
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index eceadf787a67..bf4af5248cb7 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c | |||
@@ -664,7 +664,7 @@ static int netconsole_netdev_event(struct notifier_block *this, | |||
664 | struct netconsole_target *nt; | 664 | struct netconsole_target *nt; |
665 | struct net_device *dev = ptr; | 665 | struct net_device *dev = ptr; |
666 | 666 | ||
667 | if (!(event == NETDEV_CHANGENAME)) | 667 | if (!(event == NETDEV_CHANGENAME || event == NETDEV_UNREGISTER)) |
668 | goto done; | 668 | goto done; |
669 | 669 | ||
670 | spin_lock_irqsave(&target_list_lock, flags); | 670 | spin_lock_irqsave(&target_list_lock, flags); |
@@ -675,6 +675,15 @@ static int netconsole_netdev_event(struct notifier_block *this, | |||
675 | case NETDEV_CHANGENAME: | 675 | case NETDEV_CHANGENAME: |
676 | strlcpy(nt->np.dev_name, dev->name, IFNAMSIZ); | 676 | strlcpy(nt->np.dev_name, dev->name, IFNAMSIZ); |
677 | break; | 677 | break; |
678 | case NETDEV_UNREGISTER: | ||
679 | if (!nt->enabled) | ||
680 | break; | ||
681 | netpoll_cleanup(&nt->np); | ||
682 | nt->enabled = 0; | ||
683 | printk(KERN_INFO "netconsole: network logging stopped" | ||
684 | ", interface %s unregistered\n", | ||
685 | dev->name); | ||
686 | break; | ||
678 | } | 687 | } |
679 | } | 688 | } |
680 | netconsole_target_put(nt); | 689 | netconsole_target_put(nt); |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 8ee21030e9ac..dfc6cf765fbd 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -180,6 +180,20 @@ config USB_NET_CDCETHER | |||
180 | IEEE 802 "local assignment" bit is set in the address, a "usbX" | 180 | IEEE 802 "local assignment" bit is set in the address, a "usbX" |
181 | name is used instead. | 181 | name is used instead. |
182 | 182 | ||
183 | config USB_NET_CDC_EEM | ||
184 | tristate "CDC EEM support" | ||
185 | depends on USB_USBNET && EXPERIMENTAL | ||
186 | help | ||
187 | This option supports devices conforming to the Communication Device | ||
188 | Class (CDC) Ethernet Emulation Model, a specification that's easy to | ||
189 | implement in device firmware. The CDC EEM specifications are available | ||
190 | from <http://www.usb.org/>. | ||
191 | |||
192 | This driver creates an interface named "ethX", where X depends on | ||
193 | what other networking devices you have in use. However, if the | ||
194 | IEEE 802 "local assignment" bit is set in the address, a "usbX" | ||
195 | name is used instead. | ||
196 | |||
183 | config USB_NET_DM9601 | 197 | config USB_NET_DM9601 |
184 | tristate "Davicom DM9601 based USB 1.1 10/100 ethernet devices" | 198 | tristate "Davicom DM9601 based USB 1.1 10/100 ethernet devices" |
185 | depends on USB_USBNET | 199 | depends on USB_USBNET |
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile index 88a87eeb376a..c8aef62cf2b7 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile | |||
@@ -9,6 +9,7 @@ obj-$(CONFIG_USB_RTL8150) += rtl8150.o | |||
9 | obj-$(CONFIG_USB_HSO) += hso.o | 9 | obj-$(CONFIG_USB_HSO) += hso.o |
10 | obj-$(CONFIG_USB_NET_AX8817X) += asix.o | 10 | obj-$(CONFIG_USB_NET_AX8817X) += asix.o |
11 | obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o | 11 | obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o |
12 | obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o | ||
12 | obj-$(CONFIG_USB_NET_DM9601) += dm9601.o | 13 | obj-$(CONFIG_USB_NET_DM9601) += dm9601.o |
13 | obj-$(CONFIG_USB_NET_SMSC95XX) += smsc95xx.o | 14 | obj-$(CONFIG_USB_NET_SMSC95XX) += smsc95xx.o |
14 | obj-$(CONFIG_USB_NET_GL620A) += gl620a.o | 15 | obj-$(CONFIG_USB_NET_GL620A) += gl620a.o |
diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c new file mode 100644 index 000000000000..80e01778dd3b --- /dev/null +++ b/drivers/net/usb/cdc_eem.c | |||
@@ -0,0 +1,381 @@ | |||
1 | /* | ||
2 | * USB CDC EEM network interface driver | ||
3 | * Copyright (C) 2009 Oberthur Technologies | ||
4 | * by Omar Laazimani, Olivier Condemine | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/module.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/netdevice.h> | ||
24 | #include <linux/etherdevice.h> | ||
25 | #include <linux/ctype.h> | ||
26 | #include <linux/ethtool.h> | ||
27 | #include <linux/workqueue.h> | ||
28 | #include <linux/mii.h> | ||
29 | #include <linux/usb.h> | ||
30 | #include <linux/crc32.h> | ||
31 | #include <linux/usb/cdc.h> | ||
32 | #include <linux/usb/usbnet.h> | ||
33 | |||
34 | |||
35 | /* | ||
36 | * This driver is an implementation of the CDC "Ethernet Emulation | ||
37 | * Model" (EEM) specification, which encapsulates Ethernet frames | ||
38 | * for transport over USB using a simpler USB device model than the | ||
39 | * previous CDC "Ethernet Control Model" (ECM, or "CDC Ethernet"). | ||
40 | * | ||
41 | * For details, see www.usb.org/developers/devclass_docs/CDC_EEM10.pdf | ||
42 | * | ||
43 | * This version has been tested with GIGAntIC WuaoW SIM Smart Card on 2.6.24, | ||
44 | * 2.6.27 and 2.6.30rc2 kernel. | ||
45 | * It has also been validated on Openmoko Om 2008.12 (based on 2.6.24 kernel). | ||
46 | * build on 23-April-2009 | ||
47 | */ | ||
48 | |||
49 | #define EEM_HEAD 2 /* 2 byte header */ | ||
50 | |||
51 | /*-------------------------------------------------------------------------*/ | ||
52 | |||
53 | static void eem_linkcmd_complete(struct urb *urb) | ||
54 | { | ||
55 | dev_kfree_skb(urb->context); | ||
56 | usb_free_urb(urb); | ||
57 | } | ||
58 | |||
59 | static void eem_linkcmd(struct usbnet *dev, struct sk_buff *skb) | ||
60 | { | ||
61 | struct urb *urb; | ||
62 | int status; | ||
63 | |||
64 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
65 | if (!urb) | ||
66 | goto fail; | ||
67 | |||
68 | usb_fill_bulk_urb(urb, dev->udev, dev->out, | ||
69 | skb->data, skb->len, eem_linkcmd_complete, skb); | ||
70 | |||
71 | status = usb_submit_urb(urb, GFP_ATOMIC); | ||
72 | if (status) { | ||
73 | usb_free_urb(urb); | ||
74 | fail: | ||
75 | dev_kfree_skb(skb); | ||
76 | devwarn(dev, "link cmd failure\n"); | ||
77 | return; | ||
78 | } | ||
79 | } | ||
80 | |||
81 | static int eem_bind(struct usbnet *dev, struct usb_interface *intf) | ||
82 | { | ||
83 | int status = 0; | ||
84 | |||
85 | status = usbnet_get_endpoints(dev, intf); | ||
86 | if (status < 0) { | ||
87 | usb_set_intfdata(intf, NULL); | ||
88 | usb_driver_release_interface(driver_of(intf), intf); | ||
89 | return status; | ||
90 | } | ||
91 | |||
92 | /* no jumbogram (16K) support for now */ | ||
93 | |||
94 | dev->net->hard_header_len += EEM_HEAD + ETH_FCS_LEN; | ||
95 | |||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | /* | ||
100 | * EEM permits packing multiple Ethernet frames into USB transfers | ||
101 | * (a "bundle"), but for TX we don't try to do that. | ||
102 | */ | ||
103 | static struct sk_buff *eem_tx_fixup(struct usbnet *dev, struct sk_buff *skb, | ||
104 | gfp_t flags) | ||
105 | { | ||
106 | struct sk_buff *skb2 = NULL; | ||
107 | u16 len = skb->len; | ||
108 | u32 crc = 0; | ||
109 | int padlen = 0; | ||
110 | |||
111 | /* When ((len + EEM_HEAD + ETH_FCS_LEN) % dev->maxpacket) is | ||
112 | * zero, stick two bytes of zero length EEM packet on the end. | ||
113 | * Else the framework would add invalid single byte padding, | ||
114 | * since it can't know whether ZLPs will be handled right by | ||
115 | * all the relevant hardware and software. | ||
116 | */ | ||
117 | if (!((len + EEM_HEAD + ETH_FCS_LEN) % dev->maxpacket)) | ||
118 | padlen += 2; | ||
119 | |||
120 | if (!skb_cloned(skb)) { | ||
121 | int headroom = skb_headroom(skb); | ||
122 | int tailroom = skb_tailroom(skb); | ||
123 | |||
124 | if ((tailroom >= ETH_FCS_LEN + padlen) | ||
125 | && (headroom >= EEM_HEAD)) | ||
126 | goto done; | ||
127 | |||
128 | if ((headroom + tailroom) | ||
129 | > (EEM_HEAD + ETH_FCS_LEN + padlen)) { | ||
130 | skb->data = memmove(skb->head + | ||
131 | EEM_HEAD, | ||
132 | skb->data, | ||
133 | skb->len); | ||
134 | skb_set_tail_pointer(skb, len); | ||
135 | goto done; | ||
136 | } | ||
137 | } | ||
138 | |||
139 | skb2 = skb_copy_expand(skb, EEM_HEAD, ETH_FCS_LEN + padlen, flags); | ||
140 | if (!skb2) | ||
141 | return NULL; | ||
142 | |||
143 | dev_kfree_skb_any(skb); | ||
144 | skb = skb2; | ||
145 | |||
146 | done: | ||
147 | /* we don't use the "no Ethernet CRC" option */ | ||
148 | crc = crc32_le(~0, skb->data, skb->len); | ||
149 | crc = ~crc; | ||
150 | |||
151 | put_unaligned_le32(crc, skb_put(skb, 4)); | ||
152 | |||
153 | /* EEM packet header format: | ||
154 | * b0..13: length of ethernet frame | ||
155 | * b14: bmCRC (1 == valid Ethernet CRC) | ||
156 | * b15: bmType (0 == data) | ||
157 | */ | ||
158 | len = skb->len; | ||
159 | put_unaligned_le16(BIT(14) | len, skb_push(skb, 2)); | ||
160 | |||
161 | /* Bundle a zero length EEM packet if needed */ | ||
162 | if (padlen) | ||
163 | put_unaligned_le16(0, skb_put(skb, 2)); | ||
164 | |||
165 | return skb; | ||
166 | } | ||
167 | |||
168 | static int eem_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
169 | { | ||
170 | /* | ||
171 | * Our task here is to strip off framing, leaving skb with one | ||
172 | * data frame for the usbnet framework code to process. But we | ||
173 | * may have received multiple EEM payloads, or command payloads. | ||
174 | * So we must process _everything_ as if it's a header, except | ||
175 | * maybe the last data payload | ||
176 | * | ||
177 | * REVISIT the framework needs updating so that when we consume | ||
178 | * all payloads (the last or only message was a command, or a | ||
179 | * zero length EEM packet) that is not accounted as an rx_error. | ||
180 | */ | ||
181 | do { | ||
182 | struct sk_buff *skb2 = NULL; | ||
183 | u16 header; | ||
184 | u16 len = 0; | ||
185 | |||
186 | /* incomplete EEM header? */ | ||
187 | if (skb->len < EEM_HEAD) | ||
188 | return 0; | ||
189 | |||
190 | /* | ||
191 | * EEM packet header format: | ||
192 | * b0..14: EEM type dependant (Data or Command) | ||
193 | * b15: bmType | ||
194 | */ | ||
195 | header = get_unaligned_le16(skb->data); | ||
196 | skb_pull(skb, EEM_HEAD); | ||
197 | |||
198 | /* | ||
199 | * The bmType bit helps to denote when EEM | ||
200 | * packet is data or command : | ||
201 | * bmType = 0 : EEM data payload | ||
202 | * bmType = 1 : EEM (link) command | ||
203 | */ | ||
204 | if (header & BIT(15)) { | ||
205 | u16 bmEEMCmd; | ||
206 | |||
207 | /* | ||
208 | * EEM (link) command packet: | ||
209 | * b0..10: bmEEMCmdParam | ||
210 | * b11..13: bmEEMCmd | ||
211 | * b14: bmReserved (must be 0) | ||
212 | * b15: 1 (EEM command) | ||
213 | */ | ||
214 | if (header & BIT(14)) { | ||
215 | devdbg(dev, "reserved command %04x\n", header); | ||
216 | continue; | ||
217 | } | ||
218 | |||
219 | bmEEMCmd = (header >> 11) & 0x7; | ||
220 | switch (bmEEMCmd) { | ||
221 | |||
222 | /* Responding to echo requests is mandatory. */ | ||
223 | case 0: /* Echo command */ | ||
224 | len = header & 0x7FF; | ||
225 | |||
226 | /* bogus command? */ | ||
227 | if (skb->len < len) | ||
228 | return 0; | ||
229 | |||
230 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
231 | if (unlikely(!skb2)) | ||
232 | goto next; | ||
233 | skb_trim(skb2, len); | ||
234 | put_unaligned_le16(BIT(15) | (1 << 11) | len, | ||
235 | skb_push(skb2, 2)); | ||
236 | eem_linkcmd(dev, skb2); | ||
237 | break; | ||
238 | |||
239 | /* | ||
240 | * Host may choose to ignore hints. | ||
241 | * - suspend: peripheral ready to suspend | ||
242 | * - response: suggest N millisec polling | ||
243 | * - response complete: suggest N sec polling | ||
244 | */ | ||
245 | case 2: /* Suspend hint */ | ||
246 | case 3: /* Response hint */ | ||
247 | case 4: /* Response complete hint */ | ||
248 | continue; | ||
249 | |||
250 | /* | ||
251 | * Hosts should never receive host-to-peripheral | ||
252 | * or reserved command codes; or responses to an | ||
253 | * echo command we didn't send. | ||
254 | */ | ||
255 | case 1: /* Echo response */ | ||
256 | case 5: /* Tickle */ | ||
257 | default: /* reserved */ | ||
258 | devwarn(dev, "unexpected link command %d\n", | ||
259 | bmEEMCmd); | ||
260 | continue; | ||
261 | } | ||
262 | |||
263 | } else { | ||
264 | u32 crc, crc2; | ||
265 | int is_last; | ||
266 | |||
267 | /* zero length EEM packet? */ | ||
268 | if (header == 0) | ||
269 | continue; | ||
270 | |||
271 | /* | ||
272 | * EEM data packet header : | ||
273 | * b0..13: length of ethernet frame | ||
274 | * b14: bmCRC | ||
275 | * b15: 0 (EEM data) | ||
276 | */ | ||
277 | len = header & 0x3FFF; | ||
278 | |||
279 | /* bogus EEM payload? */ | ||
280 | if (skb->len < len) | ||
281 | return 0; | ||
282 | |||
283 | /* bogus ethernet frame? */ | ||
284 | if (len < (ETH_HLEN + ETH_FCS_LEN)) | ||
285 | goto next; | ||
286 | |||
287 | /* | ||
288 | * Treat the last payload differently: framework | ||
289 | * code expects our "fixup" to have stripped off | ||
290 | * headers, so "skb" is a data packet (or error). | ||
291 | * Else if it's not the last payload, keep "skb" | ||
292 | * for further processing. | ||
293 | */ | ||
294 | is_last = (len == skb->len); | ||
295 | if (is_last) | ||
296 | skb2 = skb; | ||
297 | else { | ||
298 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
299 | if (unlikely(!skb2)) | ||
300 | return 0; | ||
301 | } | ||
302 | |||
303 | crc = get_unaligned_le32(skb2->data | ||
304 | + len - ETH_FCS_LEN); | ||
305 | skb_trim(skb2, len - ETH_FCS_LEN); | ||
306 | |||
307 | /* | ||
308 | * The bmCRC helps to denote when the CRC field in | ||
309 | * the Ethernet frame contains a calculated CRC: | ||
310 | * bmCRC = 1 : CRC is calculated | ||
311 | * bmCRC = 0 : CRC = 0xDEADBEEF | ||
312 | */ | ||
313 | if (header & BIT(14)) | ||
314 | crc2 = ~crc32_le(~0, skb2->data, len); | ||
315 | else | ||
316 | crc2 = 0xdeadbeef; | ||
317 | |||
318 | if (is_last) | ||
319 | return crc == crc2; | ||
320 | |||
321 | if (unlikely(crc != crc2)) { | ||
322 | dev->stats.rx_errors++; | ||
323 | dev_kfree_skb_any(skb2); | ||
324 | } else | ||
325 | usbnet_skb_return(dev, skb2); | ||
326 | } | ||
327 | |||
328 | next: | ||
329 | skb_pull(skb, len); | ||
330 | } while (skb->len); | ||
331 | |||
332 | return 1; | ||
333 | } | ||
334 | |||
335 | static const struct driver_info eem_info = { | ||
336 | .description = "CDC EEM Device", | ||
337 | .flags = FLAG_ETHER, | ||
338 | .bind = eem_bind, | ||
339 | .rx_fixup = eem_rx_fixup, | ||
340 | .tx_fixup = eem_tx_fixup, | ||
341 | }; | ||
342 | |||
343 | /*-------------------------------------------------------------------------*/ | ||
344 | |||
345 | static const struct usb_device_id products[] = { | ||
346 | { | ||
347 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_EEM, | ||
348 | USB_CDC_PROTO_EEM), | ||
349 | .driver_info = (unsigned long) &eem_info, | ||
350 | }, | ||
351 | { | ||
352 | /* EMPTY == end of list */ | ||
353 | }, | ||
354 | }; | ||
355 | MODULE_DEVICE_TABLE(usb, products); | ||
356 | |||
357 | static struct usb_driver eem_driver = { | ||
358 | .name = "cdc_eem", | ||
359 | .id_table = products, | ||
360 | .probe = usbnet_probe, | ||
361 | .disconnect = usbnet_disconnect, | ||
362 | .suspend = usbnet_suspend, | ||
363 | .resume = usbnet_resume, | ||
364 | }; | ||
365 | |||
366 | |||
367 | static int __init eem_init(void) | ||
368 | { | ||
369 | return usb_register(&eem_driver); | ||
370 | } | ||
371 | module_init(eem_init); | ||
372 | |||
373 | static void __exit eem_exit(void) | ||
374 | { | ||
375 | usb_deregister(&eem_driver); | ||
376 | } | ||
377 | module_exit(eem_exit); | ||
378 | |||
379 | MODULE_AUTHOR("Omar Laazimani <omar.oberthur@gmail.com>"); | ||
380 | MODULE_DESCRIPTION("USB CDC EEM"); | ||
381 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index dc1665326592..5a7283372b53 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -941,6 +941,16 @@ static int smsc95xx_reset(struct usbnet *dev) | |||
941 | if (netif_msg_ifup(dev)) | 941 | if (netif_msg_ifup(dev)) |
942 | devdbg(dev, "ID_REV = 0x%08x", read_buf); | 942 | devdbg(dev, "ID_REV = 0x%08x", read_buf); |
943 | 943 | ||
944 | /* Configure GPIO pins as LED outputs */ | ||
945 | write_buf = LED_GPIO_CFG_SPD_LED | LED_GPIO_CFG_LNK_LED | | ||
946 | LED_GPIO_CFG_FDX_LED; | ||
947 | ret = smsc95xx_write_reg(dev, LED_GPIO_CFG, write_buf); | ||
948 | if (ret < 0) { | ||
949 | devwarn(dev, "Failed to write LED_GPIO_CFG register, ret=%d", | ||
950 | ret); | ||
951 | return ret; | ||
952 | } | ||
953 | |||
944 | /* Init Tx */ | 954 | /* Init Tx */ |
945 | write_buf = 0; | 955 | write_buf = 0; |
946 | ret = smsc95xx_write_reg(dev, FLOW, write_buf); | 956 | ret = smsc95xx_write_reg(dev, FLOW, write_buf); |
@@ -1231,6 +1241,11 @@ static const struct usb_device_id products[] = { | |||
1231 | USB_DEVICE(0x0424, 0x9500), | 1241 | USB_DEVICE(0x0424, 0x9500), |
1232 | .driver_info = (unsigned long) &smsc95xx_info, | 1242 | .driver_info = (unsigned long) &smsc95xx_info, |
1233 | }, | 1243 | }, |
1244 | { | ||
1245 | /* SMSC9512/9514 USB Hub & Ethernet Device */ | ||
1246 | USB_DEVICE(0x0424, 0xec00), | ||
1247 | .driver_info = (unsigned long) &smsc95xx_info, | ||
1248 | }, | ||
1234 | { }, /* END */ | 1249 | { }, /* END */ |
1235 | }; | 1250 | }; |
1236 | MODULE_DEVICE_TABLE(usb, products); | 1251 | MODULE_DEVICE_TABLE(usb, products); |
diff --git a/drivers/net/usb/smsc95xx.h b/drivers/net/usb/smsc95xx.h index 66b5c84f302e..86bc44977fbd 100644 --- a/drivers/net/usb/smsc95xx.h +++ b/drivers/net/usb/smsc95xx.h | |||
@@ -99,6 +99,9 @@ | |||
99 | #define PM_CTL_WUPS_MULTI_ (0x00000003) | 99 | #define PM_CTL_WUPS_MULTI_ (0x00000003) |
100 | 100 | ||
101 | #define LED_GPIO_CFG (0x24) | 101 | #define LED_GPIO_CFG (0x24) |
102 | #define LED_GPIO_CFG_SPD_LED (0x01000000) | ||
103 | #define LED_GPIO_CFG_LNK_LED (0x00100000) | ||
104 | #define LED_GPIO_CFG_FDX_LED (0x00010000) | ||
102 | 105 | ||
103 | #define GPIO_CFG (0x28) | 106 | #define GPIO_CFG (0x28) |
104 | 107 | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 9c82a39497e5..4d1d47953fc6 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -616,10 +616,11 @@ static int virtnet_open(struct net_device *dev) | |||
616 | static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, | 616 | static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, |
617 | struct scatterlist *data, int out, int in) | 617 | struct scatterlist *data, int out, int in) |
618 | { | 618 | { |
619 | struct scatterlist sg[VIRTNET_SEND_COMMAND_SG_MAX + 2]; | 619 | struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2]; |
620 | struct virtio_net_ctrl_hdr ctrl; | 620 | struct virtio_net_ctrl_hdr ctrl; |
621 | virtio_net_ctrl_ack status = ~0; | 621 | virtio_net_ctrl_ack status = ~0; |
622 | unsigned int tmp; | 622 | unsigned int tmp; |
623 | int i; | ||
623 | 624 | ||
624 | if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) { | 625 | if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) { |
625 | BUG(); /* Caller should know better */ | 626 | BUG(); /* Caller should know better */ |
@@ -637,7 +638,8 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, | |||
637 | sg_init_table(sg, out + in); | 638 | sg_init_table(sg, out + in); |
638 | 639 | ||
639 | sg_set_buf(&sg[0], &ctrl, sizeof(ctrl)); | 640 | sg_set_buf(&sg[0], &ctrl, sizeof(ctrl)); |
640 | memcpy(&sg[1], data, sizeof(struct scatterlist) * (out + in - 2)); | 641 | for_each_sg(data, s, out + in - 2, i) |
642 | sg_set_buf(&sg[i + 1], sg_virt(s), s->length); | ||
641 | sg_set_buf(&sg[out + in - 1], &status, sizeof(status)); | 643 | sg_set_buf(&sg[out + in - 1], &status, sizeof(status)); |
642 | 644 | ||
643 | if (vi->cvq->vq_ops->add_buf(vi->cvq, sg, out, in, vi) != 0) | 645 | if (vi->cvq->vq_ops->add_buf(vi->cvq, sg, out, in, vi) != 0) |
@@ -692,7 +694,7 @@ static void virtnet_set_rx_mode(struct net_device *dev) | |||
692 | promisc = ((dev->flags & IFF_PROMISC) != 0); | 694 | promisc = ((dev->flags & IFF_PROMISC) != 0); |
693 | allmulti = ((dev->flags & IFF_ALLMULTI) != 0); | 695 | allmulti = ((dev->flags & IFF_ALLMULTI) != 0); |
694 | 696 | ||
695 | sg_set_buf(sg, &promisc, sizeof(promisc)); | 697 | sg_init_one(sg, &promisc, sizeof(promisc)); |
696 | 698 | ||
697 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, | 699 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, |
698 | VIRTIO_NET_CTRL_RX_PROMISC, | 700 | VIRTIO_NET_CTRL_RX_PROMISC, |
@@ -700,7 +702,7 @@ static void virtnet_set_rx_mode(struct net_device *dev) | |||
700 | dev_warn(&dev->dev, "Failed to %sable promisc mode.\n", | 702 | dev_warn(&dev->dev, "Failed to %sable promisc mode.\n", |
701 | promisc ? "en" : "dis"); | 703 | promisc ? "en" : "dis"); |
702 | 704 | ||
703 | sg_set_buf(sg, &allmulti, sizeof(allmulti)); | 705 | sg_init_one(sg, &allmulti, sizeof(allmulti)); |
704 | 706 | ||
705 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, | 707 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, |
706 | VIRTIO_NET_CTRL_RX_ALLMULTI, | 708 | VIRTIO_NET_CTRL_RX_ALLMULTI, |
@@ -716,6 +718,8 @@ static void virtnet_set_rx_mode(struct net_device *dev) | |||
716 | return; | 718 | return; |
717 | } | 719 | } |
718 | 720 | ||
721 | sg_init_table(sg, 2); | ||
722 | |||
719 | /* Store the unicast list and count in the front of the buffer */ | 723 | /* Store the unicast list and count in the front of the buffer */ |
720 | mac_data->entries = dev->uc_count; | 724 | mac_data->entries = dev->uc_count; |
721 | addr = dev->uc_list; | 725 | addr = dev->uc_list; |
@@ -744,24 +748,24 @@ static void virtnet_set_rx_mode(struct net_device *dev) | |||
744 | kfree(buf); | 748 | kfree(buf); |
745 | } | 749 | } |
746 | 750 | ||
747 | static void virnet_vlan_rx_add_vid(struct net_device *dev, u16 vid) | 751 | static void virtnet_vlan_rx_add_vid(struct net_device *dev, u16 vid) |
748 | { | 752 | { |
749 | struct virtnet_info *vi = netdev_priv(dev); | 753 | struct virtnet_info *vi = netdev_priv(dev); |
750 | struct scatterlist sg; | 754 | struct scatterlist sg; |
751 | 755 | ||
752 | sg_set_buf(&sg, &vid, sizeof(vid)); | 756 | sg_init_one(&sg, &vid, sizeof(vid)); |
753 | 757 | ||
754 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN, | 758 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN, |
755 | VIRTIO_NET_CTRL_VLAN_ADD, &sg, 1, 0)) | 759 | VIRTIO_NET_CTRL_VLAN_ADD, &sg, 1, 0)) |
756 | dev_warn(&dev->dev, "Failed to add VLAN ID %d.\n", vid); | 760 | dev_warn(&dev->dev, "Failed to add VLAN ID %d.\n", vid); |
757 | } | 761 | } |
758 | 762 | ||
759 | static void virnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid) | 763 | static void virtnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid) |
760 | { | 764 | { |
761 | struct virtnet_info *vi = netdev_priv(dev); | 765 | struct virtnet_info *vi = netdev_priv(dev); |
762 | struct scatterlist sg; | 766 | struct scatterlist sg; |
763 | 767 | ||
764 | sg_set_buf(&sg, &vid, sizeof(vid)); | 768 | sg_init_one(&sg, &vid, sizeof(vid)); |
765 | 769 | ||
766 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN, | 770 | if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN, |
767 | VIRTIO_NET_CTRL_VLAN_DEL, &sg, 1, 0)) | 771 | VIRTIO_NET_CTRL_VLAN_DEL, &sg, 1, 0)) |
@@ -794,8 +798,8 @@ static const struct net_device_ops virtnet_netdev = { | |||
794 | .ndo_set_mac_address = virtnet_set_mac_address, | 798 | .ndo_set_mac_address = virtnet_set_mac_address, |
795 | .ndo_set_rx_mode = virtnet_set_rx_mode, | 799 | .ndo_set_rx_mode = virtnet_set_rx_mode, |
796 | .ndo_change_mtu = virtnet_change_mtu, | 800 | .ndo_change_mtu = virtnet_change_mtu, |
797 | .ndo_vlan_rx_add_vid = virnet_vlan_rx_add_vid, | 801 | .ndo_vlan_rx_add_vid = virtnet_vlan_rx_add_vid, |
798 | .ndo_vlan_rx_kill_vid = virnet_vlan_rx_kill_vid, | 802 | .ndo_vlan_rx_kill_vid = virtnet_vlan_rx_kill_vid, |
799 | #ifdef CONFIG_NET_POLL_CONTROLLER | 803 | #ifdef CONFIG_NET_POLL_CONTROLLER |
800 | .ndo_poll_controller = virtnet_netpoll, | 804 | .ndo_poll_controller = virtnet_netpoll, |
801 | #endif | 805 | #endif |
diff --git a/drivers/net/wireless/ath5k/debug.c b/drivers/net/wireless/ath5k/debug.c index 9770bb3d40f9..4904a07e4b59 100644 --- a/drivers/net/wireless/ath5k/debug.c +++ b/drivers/net/wireless/ath5k/debug.c | |||
@@ -424,7 +424,7 @@ ath5k_debug_dump_bands(struct ath5k_softc *sc) | |||
424 | 424 | ||
425 | for (b = 0; b < IEEE80211_NUM_BANDS; b++) { | 425 | for (b = 0; b < IEEE80211_NUM_BANDS; b++) { |
426 | struct ieee80211_supported_band *band = &sc->sbands[b]; | 426 | struct ieee80211_supported_band *band = &sc->sbands[b]; |
427 | char bname[5]; | 427 | char bname[6]; |
428 | switch (band->band) { | 428 | switch (band->band) { |
429 | case IEEE80211_BAND_2GHZ: | 429 | case IEEE80211_BAND_2GHZ: |
430 | strcpy(bname, "2 GHz"); | 430 | strcpy(bname, "2 GHz"); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 23644cf884f1..e7c65c4f741b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -925,11 +925,11 @@ void iwl_bg_scan_completed(struct work_struct *work) | |||
925 | 925 | ||
926 | IWL_DEBUG_SCAN(priv, "SCAN complete scan\n"); | 926 | IWL_DEBUG_SCAN(priv, "SCAN complete scan\n"); |
927 | 927 | ||
928 | ieee80211_scan_completed(priv->hw, false); | ||
929 | |||
928 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 930 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
929 | return; | 931 | return; |
930 | 932 | ||
931 | ieee80211_scan_completed(priv->hw, false); | ||
932 | |||
933 | /* Since setting the TXPOWER may have been deferred while | 933 | /* Since setting the TXPOWER may have been deferred while |
934 | * performing the scan, fire one off */ | 934 | * performing the scan, fire one off */ |
935 | mutex_lock(&priv->mutex); | 935 | mutex_lock(&priv->mutex); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 617c4235d971..70a00c8ee42e 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -1694,7 +1694,6 @@ void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
1694 | rxq->free_count = 0; | 1694 | rxq->free_count = 0; |
1695 | spin_unlock_irqrestore(&rxq->lock, flags); | 1695 | spin_unlock_irqrestore(&rxq->lock, flags); |
1696 | } | 1696 | } |
1697 | EXPORT_SYMBOL(iwl3945_rx_queue_reset); | ||
1698 | 1697 | ||
1699 | /* | 1698 | /* |
1700 | * this should be called while priv->lock is locked | 1699 | * this should be called while priv->lock is locked |
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index db91db776508..bebf735cd4bd 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c | |||
@@ -2558,6 +2558,11 @@ static int rndis_wext_bind(struct usbnet *usbdev, struct usb_interface *intf) | |||
2558 | mutex_init(&priv->command_lock); | 2558 | mutex_init(&priv->command_lock); |
2559 | spin_lock_init(&priv->stats_lock); | 2559 | spin_lock_init(&priv->stats_lock); |
2560 | 2560 | ||
2561 | /* because rndis_command() sleeps we need to use workqueue */ | ||
2562 | priv->workqueue = create_singlethread_workqueue("rndis_wlan"); | ||
2563 | INIT_WORK(&priv->work, rndis_wext_worker); | ||
2564 | INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats); | ||
2565 | |||
2561 | /* try bind rndis_host */ | 2566 | /* try bind rndis_host */ |
2562 | retval = generic_rndis_bind(usbdev, intf, FLAG_RNDIS_PHYM_WIRELESS); | 2567 | retval = generic_rndis_bind(usbdev, intf, FLAG_RNDIS_PHYM_WIRELESS); |
2563 | if (retval < 0) | 2568 | if (retval < 0) |
@@ -2603,16 +2608,17 @@ static int rndis_wext_bind(struct usbnet *usbdev, struct usb_interface *intf) | |||
2603 | disassociate(usbdev, 1); | 2608 | disassociate(usbdev, 1); |
2604 | netif_carrier_off(usbdev->net); | 2609 | netif_carrier_off(usbdev->net); |
2605 | 2610 | ||
2606 | /* because rndis_command() sleeps we need to use workqueue */ | ||
2607 | priv->workqueue = create_singlethread_workqueue("rndis_wlan"); | ||
2608 | INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats); | ||
2609 | queue_delayed_work(priv->workqueue, &priv->stats_work, | 2611 | queue_delayed_work(priv->workqueue, &priv->stats_work, |
2610 | round_jiffies_relative(STATS_UPDATE_JIFFIES)); | 2612 | round_jiffies_relative(STATS_UPDATE_JIFFIES)); |
2611 | INIT_WORK(&priv->work, rndis_wext_worker); | ||
2612 | 2613 | ||
2613 | return 0; | 2614 | return 0; |
2614 | 2615 | ||
2615 | fail: | 2616 | fail: |
2617 | cancel_delayed_work_sync(&priv->stats_work); | ||
2618 | cancel_work_sync(&priv->work); | ||
2619 | flush_workqueue(priv->workqueue); | ||
2620 | destroy_workqueue(priv->workqueue); | ||
2621 | |||
2616 | kfree(priv); | 2622 | kfree(priv); |
2617 | return retval; | 2623 | return retval; |
2618 | } | 2624 | } |
diff --git a/drivers/serial/jsm/jsm.h b/drivers/serial/jsm/jsm.h index 8871aaa3dba6..c0a3e2734e24 100644 --- a/drivers/serial/jsm/jsm.h +++ b/drivers/serial/jsm/jsm.h | |||
@@ -130,8 +130,6 @@ struct jsm_board | |||
130 | struct pci_dev *pci_dev; | 130 | struct pci_dev *pci_dev; |
131 | u32 maxports; /* MAX ports this board can handle */ | 131 | u32 maxports; /* MAX ports this board can handle */ |
132 | 132 | ||
133 | spinlock_t bd_lock; /* Used to protect board */ | ||
134 | |||
135 | spinlock_t bd_intr_lock; /* Used to protect the poller tasklet and | 133 | spinlock_t bd_intr_lock; /* Used to protect the poller tasklet and |
136 | * the interrupt routine from each other. | 134 | * the interrupt routine from each other. |
137 | */ | 135 | */ |
diff --git a/drivers/serial/jsm/jsm_driver.c b/drivers/serial/jsm/jsm_driver.c index d2d32a198629..b3604aa322a4 100644 --- a/drivers/serial/jsm/jsm_driver.c +++ b/drivers/serial/jsm/jsm_driver.c | |||
@@ -88,7 +88,6 @@ static int __devinit jsm_probe_one(struct pci_dev *pdev, const struct pci_device | |||
88 | else | 88 | else |
89 | brd->maxports = 2; | 89 | brd->maxports = 2; |
90 | 90 | ||
91 | spin_lock_init(&brd->bd_lock); | ||
92 | spin_lock_init(&brd->bd_intr_lock); | 91 | spin_lock_init(&brd->bd_intr_lock); |
93 | 92 | ||
94 | /* store which revision we have */ | 93 | /* store which revision we have */ |
diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 0dbd6c68d76b..d8d0be5151e3 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile | |||
@@ -56,7 +56,6 @@ obj-$(CONFIG_FB_CT65550) += chipsfb.o | |||
56 | obj-$(CONFIG_FB_IMSTT) += imsttfb.o | 56 | obj-$(CONFIG_FB_IMSTT) += imsttfb.o |
57 | obj-$(CONFIG_FB_FM2) += fm2fb.o | 57 | obj-$(CONFIG_FB_FM2) += fm2fb.o |
58 | obj-$(CONFIG_FB_VT8623) += vt8623fb.o | 58 | obj-$(CONFIG_FB_VT8623) += vt8623fb.o |
59 | obj-$(CONFIG_FB_CYBLA) += cyblafb.o | ||
60 | obj-$(CONFIG_FB_TRIDENT) += tridentfb.o | 59 | obj-$(CONFIG_FB_TRIDENT) += tridentfb.o |
61 | obj-$(CONFIG_FB_LE80578) += vermilion/ | 60 | obj-$(CONFIG_FB_LE80578) += vermilion/ |
62 | obj-$(CONFIG_FB_S3) += s3fb.o | 61 | obj-$(CONFIG_FB_S3) += s3fb.o |
diff --git a/drivers/video/cfbfillrect.c b/drivers/video/cfbfillrect.c index 64b35766b2a2..ba9f58b2a5e8 100644 --- a/drivers/video/cfbfillrect.c +++ b/drivers/video/cfbfillrect.c | |||
@@ -9,10 +9,6 @@ | |||
9 | * | 9 | * |
10 | * NOTES: | 10 | * NOTES: |
11 | * | 11 | * |
12 | * The code for depths like 24 that don't have integer number of pixels per | ||
13 | * long is broken and needs to be fixed. For now I turned these types of | ||
14 | * mode off. | ||
15 | * | ||
16 | * Also need to add code to deal with cards endians that are different than | 12 | * Also need to add code to deal with cards endians that are different than |
17 | * the native cpu endians. I also need to deal with MSB position in the word. | 13 | * the native cpu endians. I also need to deal with MSB position in the word. |
18 | * | 14 | * |
@@ -139,7 +135,7 @@ bitfill_unaligned(struct fb_info *p, unsigned long __iomem *dst, int dst_idx, | |||
139 | 135 | ||
140 | // Trailing bits | 136 | // Trailing bits |
141 | if (last) | 137 | if (last) |
142 | FB_WRITEL(comp(pat, FB_READL(dst), first), dst); | 138 | FB_WRITEL(comp(pat, FB_READL(dst), last), dst); |
143 | } | 139 | } |
144 | } | 140 | } |
145 | 141 | ||
@@ -281,7 +277,7 @@ bitfill_unaligned_rev(struct fb_info *p, unsigned long __iomem *dst, | |||
281 | 277 | ||
282 | void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | 278 | void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) |
283 | { | 279 | { |
284 | unsigned long pat, fg; | 280 | unsigned long pat, pat2, fg; |
285 | unsigned long width = rect->width, height = rect->height; | 281 | unsigned long width = rect->width, height = rect->height; |
286 | int bits = BITS_PER_LONG, bytes = bits >> 3; | 282 | int bits = BITS_PER_LONG, bytes = bits >> 3; |
287 | u32 bpp = p->var.bits_per_pixel; | 283 | u32 bpp = p->var.bits_per_pixel; |
@@ -297,7 +293,7 @@ void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | |||
297 | else | 293 | else |
298 | fg = rect->color; | 294 | fg = rect->color; |
299 | 295 | ||
300 | pat = pixel_to_pat( bpp, fg); | 296 | pat = pixel_to_pat(bpp, fg); |
301 | 297 | ||
302 | dst = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1)); | 298 | dst = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1)); |
303 | dst_idx = ((unsigned long)p->screen_base & (bytes - 1))*8; | 299 | dst_idx = ((unsigned long)p->screen_base & (bytes - 1))*8; |
@@ -333,17 +329,16 @@ void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | |||
333 | dst_idx += p->fix.line_length*8; | 329 | dst_idx += p->fix.line_length*8; |
334 | } | 330 | } |
335 | } else { | 331 | } else { |
336 | int right; | 332 | int right, r; |
337 | int r; | ||
338 | int rot = (left-dst_idx) % bpp; | ||
339 | void (*fill_op)(struct fb_info *p, unsigned long __iomem *dst, | 333 | void (*fill_op)(struct fb_info *p, unsigned long __iomem *dst, |
340 | int dst_idx, unsigned long pat, int left, | 334 | int dst_idx, unsigned long pat, int left, |
341 | int right, unsigned n, int bits) = NULL; | 335 | int right, unsigned n, int bits) = NULL; |
342 | 336 | #ifdef __LITTLE_ENDIAN | |
343 | /* rotate pattern to correct start position */ | 337 | right = left; |
344 | pat = pat << rot | pat >> (bpp-rot); | 338 | left = bpp - right; |
345 | 339 | #else | |
346 | right = bpp-left; | 340 | right = bpp - left; |
341 | #endif | ||
347 | switch (rect->rop) { | 342 | switch (rect->rop) { |
348 | case ROP_XOR: | 343 | case ROP_XOR: |
349 | fill_op = bitfill_unaligned_rev; | 344 | fill_op = bitfill_unaligned_rev; |
@@ -352,17 +347,18 @@ void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | |||
352 | fill_op = bitfill_unaligned; | 347 | fill_op = bitfill_unaligned; |
353 | break; | 348 | break; |
354 | default: | 349 | default: |
355 | printk( KERN_ERR "cfb_fillrect(): unknown rop, defaulting to ROP_COPY\n"); | 350 | printk(KERN_ERR "cfb_fillrect(): unknown rop, defaulting to ROP_COPY\n"); |
356 | fill_op = bitfill_unaligned; | 351 | fill_op = bitfill_unaligned; |
357 | break; | 352 | break; |
358 | } | 353 | } |
359 | while (height--) { | 354 | while (height--) { |
360 | dst += dst_idx >> (ffs(bits) - 1); | 355 | dst += dst_idx / bits; |
361 | dst_idx &= (bits - 1); | 356 | dst_idx &= (bits - 1); |
362 | fill_op(p, dst, dst_idx, pat, left, right, | 357 | r = dst_idx % bpp; |
358 | /* rotate pattern to the correct start position */ | ||
359 | pat2 = le_long_to_cpu(rolx(cpu_to_le_long(pat), r, bpp)); | ||
360 | fill_op(p, dst, dst_idx, pat2, left, right, | ||
363 | width*bpp, bits); | 361 | width*bpp, bits); |
364 | r = (p->fix.line_length*8) % bpp; | ||
365 | pat = pat << (bpp-r) | pat >> r; | ||
366 | dst_idx += p->fix.line_length*8; | 362 | dst_idx += p->fix.line_length*8; |
367 | } | 363 | } |
368 | } | 364 | } |
diff --git a/drivers/video/fb_draw.h b/drivers/video/fb_draw.h index 1db622192bde..04c01faaf772 100644 --- a/drivers/video/fb_draw.h +++ b/drivers/video/fb_draw.h | |||
@@ -33,11 +33,11 @@ pixel_to_pat( u32 bpp, u32 pixel) | |||
33 | case 8: | 33 | case 8: |
34 | return 0x0101010101010101ul*pixel; | 34 | return 0x0101010101010101ul*pixel; |
35 | case 12: | 35 | case 12: |
36 | return 0x0001001001001001ul*pixel; | 36 | return 0x1001001001001001ul*pixel; |
37 | case 16: | 37 | case 16: |
38 | return 0x0001000100010001ul*pixel; | 38 | return 0x0001000100010001ul*pixel; |
39 | case 24: | 39 | case 24: |
40 | return 0x0000000001000001ul*pixel; | 40 | return 0x0001000001000001ul*pixel; |
41 | case 32: | 41 | case 32: |
42 | return 0x0000000100000001ul*pixel; | 42 | return 0x0000000100000001ul*pixel; |
43 | default: | 43 | default: |
@@ -58,11 +58,11 @@ pixel_to_pat( u32 bpp, u32 pixel) | |||
58 | case 8: | 58 | case 8: |
59 | return 0x01010101ul*pixel; | 59 | return 0x01010101ul*pixel; |
60 | case 12: | 60 | case 12: |
61 | return 0x00001001ul*pixel; | 61 | return 0x01001001ul*pixel; |
62 | case 16: | 62 | case 16: |
63 | return 0x00010001ul*pixel; | 63 | return 0x00010001ul*pixel; |
64 | case 24: | 64 | case 24: |
65 | return 0x00000001ul*pixel; | 65 | return 0x01000001ul*pixel; |
66 | case 32: | 66 | case 32: |
67 | return 0x00000001ul*pixel; | 67 | return 0x00000001ul*pixel; |
68 | default: | 68 | default: |
@@ -167,4 +167,17 @@ static inline unsigned long fb_rev_pixels_in_long(unsigned long val, | |||
167 | 167 | ||
168 | #endif /* CONFIG_FB_CFB_REV_PIXELS_IN_BYTE */ | 168 | #endif /* CONFIG_FB_CFB_REV_PIXELS_IN_BYTE */ |
169 | 169 | ||
170 | #define cpu_to_le_long _cpu_to_le_long(BITS_PER_LONG) | ||
171 | #define _cpu_to_le_long(x) __cpu_to_le_long(x) | ||
172 | #define __cpu_to_le_long(x) cpu_to_le##x | ||
173 | |||
174 | #define le_long_to_cpu _le_long_to_cpu(BITS_PER_LONG) | ||
175 | #define _le_long_to_cpu(x) __le_long_to_cpu(x) | ||
176 | #define __le_long_to_cpu(x) le##x##_to_cpu | ||
177 | |||
178 | static inline unsigned long rolx(unsigned long word, unsigned int shift, unsigned int x) | ||
179 | { | ||
180 | return (word << shift) | (word >> (x - shift)); | ||
181 | } | ||
182 | |||
170 | #endif /* FB_DRAW_H */ | 183 | #endif /* FB_DRAW_H */ |
diff --git a/drivers/video/sysfillrect.c b/drivers/video/sysfillrect.c index f94d6b6e29ee..33ee3d34f9d2 100644 --- a/drivers/video/sysfillrect.c +++ b/drivers/video/sysfillrect.c | |||
@@ -124,7 +124,7 @@ bitfill_unaligned(struct fb_info *p, unsigned long *dst, int dst_idx, | |||
124 | 124 | ||
125 | /* Trailing bits */ | 125 | /* Trailing bits */ |
126 | if (last) | 126 | if (last) |
127 | *dst = comp(pat, *dst, first); | 127 | *dst = comp(pat, *dst, last); |
128 | } | 128 | } |
129 | } | 129 | } |
130 | 130 | ||
@@ -242,7 +242,7 @@ bitfill_unaligned_rev(struct fb_info *p, unsigned long *dst, int dst_idx, | |||
242 | 242 | ||
243 | void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | 243 | void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) |
244 | { | 244 | { |
245 | unsigned long pat, fg; | 245 | unsigned long pat, pat2, fg; |
246 | unsigned long width = rect->width, height = rect->height; | 246 | unsigned long width = rect->width, height = rect->height; |
247 | int bits = BITS_PER_LONG, bytes = bits >> 3; | 247 | int bits = BITS_PER_LONG, bytes = bits >> 3; |
248 | u32 bpp = p->var.bits_per_pixel; | 248 | u32 bpp = p->var.bits_per_pixel; |
@@ -292,17 +292,16 @@ void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | |||
292 | dst_idx += p->fix.line_length*8; | 292 | dst_idx += p->fix.line_length*8; |
293 | } | 293 | } |
294 | } else { | 294 | } else { |
295 | int right; | 295 | int right, r; |
296 | int r; | ||
297 | int rot = (left-dst_idx) % bpp; | ||
298 | void (*fill_op)(struct fb_info *p, unsigned long *dst, | 296 | void (*fill_op)(struct fb_info *p, unsigned long *dst, |
299 | int dst_idx, unsigned long pat, int left, | 297 | int dst_idx, unsigned long pat, int left, |
300 | int right, unsigned n, int bits) = NULL; | 298 | int right, unsigned n, int bits) = NULL; |
301 | 299 | #ifdef __LITTLE_ENDIAN | |
302 | /* rotate pattern to correct start position */ | 300 | right = left; |
303 | pat = pat << rot | pat >> (bpp-rot); | 301 | left = bpp - right; |
304 | 302 | #else | |
305 | right = bpp-left; | 303 | right = bpp - left; |
304 | #endif | ||
306 | switch (rect->rop) { | 305 | switch (rect->rop) { |
307 | case ROP_XOR: | 306 | case ROP_XOR: |
308 | fill_op = bitfill_unaligned_rev; | 307 | fill_op = bitfill_unaligned_rev; |
@@ -311,18 +310,19 @@ void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) | |||
311 | fill_op = bitfill_unaligned; | 310 | fill_op = bitfill_unaligned; |
312 | break; | 311 | break; |
313 | default: | 312 | default: |
314 | printk(KERN_ERR "cfb_fillrect(): unknown rop, " | 313 | printk(KERN_ERR "sys_fillrect(): unknown rop, " |
315 | "defaulting to ROP_COPY\n"); | 314 | "defaulting to ROP_COPY\n"); |
316 | fill_op = bitfill_unaligned; | 315 | fill_op = bitfill_unaligned; |
317 | break; | 316 | break; |
318 | } | 317 | } |
319 | while (height--) { | 318 | while (height--) { |
320 | dst += dst_idx >> (ffs(bits) - 1); | 319 | dst += dst_idx / bits; |
321 | dst_idx &= (bits - 1); | 320 | dst_idx &= (bits - 1); |
322 | fill_op(p, dst, dst_idx, pat, left, right, | 321 | r = dst_idx % bpp; |
322 | /* rotate pattern to the correct start position */ | ||
323 | pat2 = le_long_to_cpu(rolx(cpu_to_le_long(pat), r, bpp)); | ||
324 | fill_op(p, dst, dst_idx, pat2, left, right, | ||
323 | width*bpp, bits); | 325 | width*bpp, bits); |
324 | r = (p->fix.line_length*8) % bpp; | ||
325 | pat = pat << (bpp-r) | pat >> r; | ||
326 | dst_idx += p->fix.line_length*8; | 326 | dst_idx += p->fix.line_length*8; |
327 | } | 327 | } |
328 | } | 328 | } |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index efa4b363ce72..f5bbd9e83416 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
@@ -513,7 +513,8 @@ static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr | |||
513 | char *buf) | 513 | char *buf) |
514 | { | 514 | { |
515 | return sprintf(buf, "%llu\n", | 515 | return sprintf(buf, "%llu\n", |
516 | (u64)balloon_stats.target_pages << PAGE_SHIFT); | 516 | (unsigned long long)balloon_stats.target_pages |
517 | << PAGE_SHIFT); | ||
517 | } | 518 | } |
518 | 519 | ||
519 | static ssize_t store_target(struct sys_device *dev, | 520 | static ssize_t store_target(struct sys_device *dev, |