diff options
Diffstat (limited to 'drivers')
106 files changed, 933 insertions, 623 deletions
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c index 2964f5f4a7ef..6b3e0c2f33e2 100644 --- a/drivers/clocksource/sh_cmt.c +++ b/drivers/clocksource/sh_cmt.c | |||
| @@ -40,6 +40,7 @@ struct sh_cmt_priv { | |||
| 40 | struct platform_device *pdev; | 40 | struct platform_device *pdev; |
| 41 | 41 | ||
| 42 | unsigned long flags; | 42 | unsigned long flags; |
| 43 | unsigned long flags_suspend; | ||
| 43 | unsigned long match_value; | 44 | unsigned long match_value; |
| 44 | unsigned long next_match_value; | 45 | unsigned long next_match_value; |
| 45 | unsigned long max_match_value; | 46 | unsigned long max_match_value; |
| @@ -667,11 +668,38 @@ static int __devexit sh_cmt_remove(struct platform_device *pdev) | |||
| 667 | return -EBUSY; /* cannot unregister clockevent and clocksource */ | 668 | return -EBUSY; /* cannot unregister clockevent and clocksource */ |
| 668 | } | 669 | } |
| 669 | 670 | ||
| 671 | static int sh_cmt_suspend(struct device *dev) | ||
| 672 | { | ||
| 673 | struct platform_device *pdev = to_platform_device(dev); | ||
| 674 | struct sh_cmt_priv *p = platform_get_drvdata(pdev); | ||
| 675 | |||
| 676 | /* save flag state and stop CMT channel */ | ||
| 677 | p->flags_suspend = p->flags; | ||
| 678 | sh_cmt_stop(p, p->flags); | ||
| 679 | return 0; | ||
| 680 | } | ||
| 681 | |||
| 682 | static int sh_cmt_resume(struct device *dev) | ||
| 683 | { | ||
| 684 | struct platform_device *pdev = to_platform_device(dev); | ||
| 685 | struct sh_cmt_priv *p = platform_get_drvdata(pdev); | ||
| 686 | |||
| 687 | /* start CMT channel from saved state */ | ||
| 688 | sh_cmt_start(p, p->flags_suspend); | ||
| 689 | return 0; | ||
| 690 | } | ||
| 691 | |||
| 692 | static struct dev_pm_ops sh_cmt_dev_pm_ops = { | ||
| 693 | .suspend = sh_cmt_suspend, | ||
| 694 | .resume = sh_cmt_resume, | ||
| 695 | }; | ||
| 696 | |||
| 670 | static struct platform_driver sh_cmt_device_driver = { | 697 | static struct platform_driver sh_cmt_device_driver = { |
| 671 | .probe = sh_cmt_probe, | 698 | .probe = sh_cmt_probe, |
| 672 | .remove = __devexit_p(sh_cmt_remove), | 699 | .remove = __devexit_p(sh_cmt_remove), |
| 673 | .driver = { | 700 | .driver = { |
| 674 | .name = "sh_cmt", | 701 | .name = "sh_cmt", |
| 702 | .pm = &sh_cmt_dev_pm_ops, | ||
| 675 | } | 703 | } |
| 676 | }; | 704 | }; |
| 677 | 705 | ||
diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c index 0ca1ee768a1f..8ce74d95ae4d 100644 --- a/drivers/md/dm-log-userspace-transfer.c +++ b/drivers/md/dm-log-userspace-transfer.c | |||
| @@ -108,7 +108,7 @@ static int fill_pkg(struct cn_msg *msg, struct dm_ulog_request *tfr) | |||
| 108 | *(pkg->data_size) = 0; | 108 | *(pkg->data_size) = 0; |
| 109 | } else if (tfr->data_size > *(pkg->data_size)) { | 109 | } else if (tfr->data_size > *(pkg->data_size)) { |
| 110 | DMERR("Insufficient space to receive package [%u] " | 110 | DMERR("Insufficient space to receive package [%u] " |
| 111 | "(%u vs %lu)", tfr->request_type, | 111 | "(%u vs %zu)", tfr->request_type, |
| 112 | tfr->data_size, *(pkg->data_size)); | 112 | tfr->data_size, *(pkg->data_size)); |
| 113 | 113 | ||
| 114 | *(pkg->data_size) = 0; | 114 | *(pkg->data_size) = 0; |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 103f2d33fa89..9dd872000cec 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -4364,6 +4364,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4364 | if (mode == 1) | 4364 | if (mode == 1) |
| 4365 | set_disk_ro(disk, 1); | 4365 | set_disk_ro(disk, 1); |
| 4366 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 4366 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 4367 | err = 0; | ||
| 4367 | } | 4368 | } |
| 4368 | out: | 4369 | out: |
| 4369 | mutex_unlock(&mddev->open_mutex); | 4370 | mutex_unlock(&mddev->open_mutex); |
diff --git a/drivers/media/common/tuners/qt1010.c b/drivers/media/common/tuners/qt1010.c index 825aa1412e6f..9f5dba244cb8 100644 --- a/drivers/media/common/tuners/qt1010.c +++ b/drivers/media/common/tuners/qt1010.c | |||
| @@ -64,24 +64,22 @@ static int qt1010_writereg(struct qt1010_priv *priv, u8 reg, u8 val) | |||
| 64 | /* dump all registers */ | 64 | /* dump all registers */ |
| 65 | static void qt1010_dump_regs(struct qt1010_priv *priv) | 65 | static void qt1010_dump_regs(struct qt1010_priv *priv) |
| 66 | { | 66 | { |
| 67 | char buf[52], buf2[4]; | ||
| 68 | u8 reg, val; | 67 | u8 reg, val; |
| 69 | 68 | ||
| 70 | for (reg = 0; ; reg++) { | 69 | for (reg = 0; ; reg++) { |
| 71 | if (reg % 16 == 0) { | 70 | if (reg % 16 == 0) { |
| 72 | if (reg) | 71 | if (reg) |
| 73 | printk("%s\n", buf); | 72 | printk(KERN_CONT "\n"); |
| 74 | sprintf(buf, "%02x: ", reg); | 73 | printk(KERN_DEBUG "%02x:", reg); |
| 75 | } | 74 | } |
| 76 | if (qt1010_readreg(priv, reg, &val) == 0) | 75 | if (qt1010_readreg(priv, reg, &val) == 0) |
| 77 | sprintf(buf2, "%02x ", val); | 76 | printk(KERN_CONT " %02x", val); |
| 78 | else | 77 | else |
| 79 | strcpy(buf2, "-- "); | 78 | printk(KERN_CONT " --"); |
| 80 | strcat(buf, buf2); | ||
| 81 | if (reg == 0x2f) | 79 | if (reg == 0x2f) |
| 82 | break; | 80 | break; |
| 83 | } | 81 | } |
| 84 | printk("%s\n", buf); | 82 | printk(KERN_CONT "\n"); |
| 85 | } | 83 | } |
| 86 | 84 | ||
| 87 | static int qt1010_set_params(struct dvb_frontend *fe, | 85 | static int qt1010_set_params(struct dvb_frontend *fe, |
diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c index aa20ce8cc668..f270e605da83 100644 --- a/drivers/media/common/tuners/tuner-xc2028.c +++ b/drivers/media/common/tuners/tuner-xc2028.c | |||
| @@ -1119,8 +1119,8 @@ static int xc2028_sleep(struct dvb_frontend *fe) | |||
| 1119 | struct xc2028_data *priv = fe->tuner_priv; | 1119 | struct xc2028_data *priv = fe->tuner_priv; |
| 1120 | int rc = 0; | 1120 | int rc = 0; |
| 1121 | 1121 | ||
| 1122 | /* Avoid firmware reload on slow devices */ | 1122 | /* Avoid firmware reload on slow devices or if PM disabled */ |
| 1123 | if (no_poweroff) | 1123 | if (no_poweroff || priv->ctrl.disable_power_mgmt) |
| 1124 | return 0; | 1124 | return 0; |
| 1125 | 1125 | ||
| 1126 | tuner_dbg("Putting xc2028/3028 into poweroff mode.\n"); | 1126 | tuner_dbg("Putting xc2028/3028 into poweroff mode.\n"); |
diff --git a/drivers/media/common/tuners/tuner-xc2028.h b/drivers/media/common/tuners/tuner-xc2028.h index 19de7928a74e..a90c35d50add 100644 --- a/drivers/media/common/tuners/tuner-xc2028.h +++ b/drivers/media/common/tuners/tuner-xc2028.h | |||
| @@ -38,6 +38,7 @@ struct xc2028_ctrl { | |||
| 38 | unsigned int input1:1; | 38 | unsigned int input1:1; |
| 39 | unsigned int vhfbw7:1; | 39 | unsigned int vhfbw7:1; |
| 40 | unsigned int uhfbw8:1; | 40 | unsigned int uhfbw8:1; |
| 41 | unsigned int disable_power_mgmt:1; | ||
| 41 | unsigned int demod; | 42 | unsigned int demod; |
| 42 | enum firmware_type type:2; | 43 | enum firmware_type type:2; |
| 43 | }; | 44 | }; |
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 4cb31e7c13c2..26690dfb3260 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
| @@ -81,7 +81,6 @@ static int af9015_rw_udev(struct usb_device *udev, struct req_t *req) | |||
| 81 | 81 | ||
| 82 | switch (req->cmd) { | 82 | switch (req->cmd) { |
| 83 | case GET_CONFIG: | 83 | case GET_CONFIG: |
| 84 | case BOOT: | ||
| 85 | case READ_MEMORY: | 84 | case READ_MEMORY: |
| 86 | case RECONNECT_USB: | 85 | case RECONNECT_USB: |
| 87 | case GET_IR_CODE: | 86 | case GET_IR_CODE: |
| @@ -100,6 +99,7 @@ static int af9015_rw_udev(struct usb_device *udev, struct req_t *req) | |||
| 100 | case WRITE_VIRTUAL_MEMORY: | 99 | case WRITE_VIRTUAL_MEMORY: |
| 101 | case COPY_FIRMWARE: | 100 | case COPY_FIRMWARE: |
| 102 | case DOWNLOAD_FIRMWARE: | 101 | case DOWNLOAD_FIRMWARE: |
| 102 | case BOOT: | ||
| 103 | break; | 103 | break; |
| 104 | default: | 104 | default: |
| 105 | err("unknown command:%d", req->cmd); | 105 | err("unknown command:%d", req->cmd); |
diff --git a/drivers/media/dvb/frontends/cx22700.c b/drivers/media/dvb/frontends/cx22700.c index ace5cb17165d..fbd838eca268 100644 --- a/drivers/media/dvb/frontends/cx22700.c +++ b/drivers/media/dvb/frontends/cx22700.c | |||
| @@ -380,7 +380,7 @@ struct dvb_frontend* cx22700_attach(const struct cx22700_config* config, | |||
| 380 | struct cx22700_state* state = NULL; | 380 | struct cx22700_state* state = NULL; |
| 381 | 381 | ||
| 382 | /* allocate memory for the internal state */ | 382 | /* allocate memory for the internal state */ |
| 383 | state = kmalloc(sizeof(struct cx22700_state), GFP_KERNEL); | 383 | state = kzalloc(sizeof(struct cx22700_state), GFP_KERNEL); |
| 384 | if (state == NULL) goto error; | 384 | if (state == NULL) goto error; |
| 385 | 385 | ||
| 386 | /* setup the state */ | 386 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/cx22702.c b/drivers/media/dvb/frontends/cx22702.c index 5d1abe34bddb..00b5c7e91d5d 100644 --- a/drivers/media/dvb/frontends/cx22702.c +++ b/drivers/media/dvb/frontends/cx22702.c | |||
| @@ -580,7 +580,7 @@ struct dvb_frontend *cx22702_attach(const struct cx22702_config *config, | |||
| 580 | struct cx22702_state *state = NULL; | 580 | struct cx22702_state *state = NULL; |
| 581 | 581 | ||
| 582 | /* allocate memory for the internal state */ | 582 | /* allocate memory for the internal state */ |
| 583 | state = kmalloc(sizeof(struct cx22702_state), GFP_KERNEL); | 583 | state = kzalloc(sizeof(struct cx22702_state), GFP_KERNEL); |
| 584 | if (state == NULL) | 584 | if (state == NULL) |
| 585 | goto error; | 585 | goto error; |
| 586 | 586 | ||
diff --git a/drivers/media/dvb/frontends/cx24110.c b/drivers/media/dvb/frontends/cx24110.c index 87ae29db024f..ffbcfabd83f0 100644 --- a/drivers/media/dvb/frontends/cx24110.c +++ b/drivers/media/dvb/frontends/cx24110.c | |||
| @@ -598,7 +598,7 @@ struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, | |||
| 598 | int ret; | 598 | int ret; |
| 599 | 599 | ||
| 600 | /* allocate memory for the internal state */ | 600 | /* allocate memory for the internal state */ |
| 601 | state = kmalloc(sizeof(struct cx24110_state), GFP_KERNEL); | 601 | state = kzalloc(sizeof(struct cx24110_state), GFP_KERNEL); |
| 602 | if (state == NULL) goto error; | 602 | if (state == NULL) goto error; |
| 603 | 603 | ||
| 604 | /* setup the state */ | 604 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/dvb_dummy_fe.c b/drivers/media/dvb/frontends/dvb_dummy_fe.c index db8a937cc630..a7fc7e53a551 100644 --- a/drivers/media/dvb/frontends/dvb_dummy_fe.c +++ b/drivers/media/dvb/frontends/dvb_dummy_fe.c | |||
| @@ -117,7 +117,7 @@ struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void) | |||
| 117 | struct dvb_dummy_fe_state* state = NULL; | 117 | struct dvb_dummy_fe_state* state = NULL; |
| 118 | 118 | ||
| 119 | /* allocate memory for the internal state */ | 119 | /* allocate memory for the internal state */ |
| 120 | state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); | 120 | state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); |
| 121 | if (state == NULL) goto error; | 121 | if (state == NULL) goto error; |
| 122 | 122 | ||
| 123 | /* create dvb_frontend */ | 123 | /* create dvb_frontend */ |
| @@ -137,7 +137,7 @@ struct dvb_frontend *dvb_dummy_fe_qpsk_attach(void) | |||
| 137 | struct dvb_dummy_fe_state* state = NULL; | 137 | struct dvb_dummy_fe_state* state = NULL; |
| 138 | 138 | ||
| 139 | /* allocate memory for the internal state */ | 139 | /* allocate memory for the internal state */ |
| 140 | state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); | 140 | state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); |
| 141 | if (state == NULL) goto error; | 141 | if (state == NULL) goto error; |
| 142 | 142 | ||
| 143 | /* create dvb_frontend */ | 143 | /* create dvb_frontend */ |
| @@ -157,7 +157,7 @@ struct dvb_frontend *dvb_dummy_fe_qam_attach(void) | |||
| 157 | struct dvb_dummy_fe_state* state = NULL; | 157 | struct dvb_dummy_fe_state* state = NULL; |
| 158 | 158 | ||
| 159 | /* allocate memory for the internal state */ | 159 | /* allocate memory for the internal state */ |
| 160 | state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); | 160 | state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); |
| 161 | if (state == NULL) goto error; | 161 | if (state == NULL) goto error; |
| 162 | 162 | ||
| 163 | /* create dvb_frontend */ | 163 | /* create dvb_frontend */ |
diff --git a/drivers/media/dvb/frontends/l64781.c b/drivers/media/dvb/frontends/l64781.c index e1e70e9e0cb9..3051b64aa17c 100644 --- a/drivers/media/dvb/frontends/l64781.c +++ b/drivers/media/dvb/frontends/l64781.c | |||
| @@ -501,7 +501,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config, | |||
| 501 | { .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } }; | 501 | { .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } }; |
| 502 | 502 | ||
| 503 | /* allocate memory for the internal state */ | 503 | /* allocate memory for the internal state */ |
| 504 | state = kmalloc(sizeof(struct l64781_state), GFP_KERNEL); | 504 | state = kzalloc(sizeof(struct l64781_state), GFP_KERNEL); |
| 505 | if (state == NULL) goto error; | 505 | if (state == NULL) goto error; |
| 506 | 506 | ||
| 507 | /* setup the state */ | 507 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/lgs8gl5.c b/drivers/media/dvb/frontends/lgs8gl5.c index 855852fddf22..bb37ed289a05 100644 --- a/drivers/media/dvb/frontends/lgs8gl5.c +++ b/drivers/media/dvb/frontends/lgs8gl5.c | |||
| @@ -387,7 +387,7 @@ lgs8gl5_attach(const struct lgs8gl5_config *config, struct i2c_adapter *i2c) | |||
| 387 | dprintk("%s\n", __func__); | 387 | dprintk("%s\n", __func__); |
| 388 | 388 | ||
| 389 | /* Allocate memory for the internal state */ | 389 | /* Allocate memory for the internal state */ |
| 390 | state = kmalloc(sizeof(struct lgs8gl5_state), GFP_KERNEL); | 390 | state = kzalloc(sizeof(struct lgs8gl5_state), GFP_KERNEL); |
| 391 | if (state == NULL) | 391 | if (state == NULL) |
| 392 | goto error; | 392 | goto error; |
| 393 | 393 | ||
diff --git a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c index a621f727935f..f69daaac78c9 100644 --- a/drivers/media/dvb/frontends/mt312.c +++ b/drivers/media/dvb/frontends/mt312.c | |||
| @@ -782,7 +782,7 @@ struct dvb_frontend *mt312_attach(const struct mt312_config *config, | |||
| 782 | struct mt312_state *state = NULL; | 782 | struct mt312_state *state = NULL; |
| 783 | 783 | ||
| 784 | /* allocate memory for the internal state */ | 784 | /* allocate memory for the internal state */ |
| 785 | state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL); | 785 | state = kzalloc(sizeof(struct mt312_state), GFP_KERNEL); |
| 786 | if (state == NULL) | 786 | if (state == NULL) |
| 787 | goto error; | 787 | goto error; |
| 788 | 788 | ||
diff --git a/drivers/media/dvb/frontends/nxt6000.c b/drivers/media/dvb/frontends/nxt6000.c index 0eef22dbf8a0..a763ec756f7f 100644 --- a/drivers/media/dvb/frontends/nxt6000.c +++ b/drivers/media/dvb/frontends/nxt6000.c | |||
| @@ -545,7 +545,7 @@ struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config, | |||
| 545 | struct nxt6000_state* state = NULL; | 545 | struct nxt6000_state* state = NULL; |
| 546 | 546 | ||
| 547 | /* allocate memory for the internal state */ | 547 | /* allocate memory for the internal state */ |
| 548 | state = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL); | 548 | state = kzalloc(sizeof(struct nxt6000_state), GFP_KERNEL); |
| 549 | if (state == NULL) goto error; | 549 | if (state == NULL) goto error; |
| 550 | 550 | ||
| 551 | /* setup the state */ | 551 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c index 8133ea3cddd7..38e67accb8c3 100644 --- a/drivers/media/dvb/frontends/or51132.c +++ b/drivers/media/dvb/frontends/or51132.c | |||
| @@ -562,7 +562,7 @@ struct dvb_frontend* or51132_attach(const struct or51132_config* config, | |||
| 562 | struct or51132_state* state = NULL; | 562 | struct or51132_state* state = NULL; |
| 563 | 563 | ||
| 564 | /* Allocate memory for the internal state */ | 564 | /* Allocate memory for the internal state */ |
| 565 | state = kmalloc(sizeof(struct or51132_state), GFP_KERNEL); | 565 | state = kzalloc(sizeof(struct or51132_state), GFP_KERNEL); |
| 566 | if (state == NULL) | 566 | if (state == NULL) |
| 567 | return NULL; | 567 | return NULL; |
| 568 | 568 | ||
diff --git a/drivers/media/dvb/frontends/or51211.c b/drivers/media/dvb/frontends/or51211.c index 16cf2fdd5d7d..c709ce6771c8 100644 --- a/drivers/media/dvb/frontends/or51211.c +++ b/drivers/media/dvb/frontends/or51211.c | |||
| @@ -527,7 +527,7 @@ struct dvb_frontend* or51211_attach(const struct or51211_config* config, | |||
| 527 | struct or51211_state* state = NULL; | 527 | struct or51211_state* state = NULL; |
| 528 | 528 | ||
| 529 | /* Allocate memory for the internal state */ | 529 | /* Allocate memory for the internal state */ |
| 530 | state = kmalloc(sizeof(struct or51211_state), GFP_KERNEL); | 530 | state = kzalloc(sizeof(struct or51211_state), GFP_KERNEL); |
| 531 | if (state == NULL) | 531 | if (state == NULL) |
| 532 | return NULL; | 532 | return NULL; |
| 533 | 533 | ||
diff --git a/drivers/media/dvb/frontends/s5h1409.c b/drivers/media/dvb/frontends/s5h1409.c index 3e08d985d6e5..fb3011518427 100644 --- a/drivers/media/dvb/frontends/s5h1409.c +++ b/drivers/media/dvb/frontends/s5h1409.c | |||
| @@ -796,7 +796,7 @@ struct dvb_frontend *s5h1409_attach(const struct s5h1409_config *config, | |||
| 796 | u16 reg; | 796 | u16 reg; |
| 797 | 797 | ||
| 798 | /* allocate memory for the internal state */ | 798 | /* allocate memory for the internal state */ |
| 799 | state = kmalloc(sizeof(struct s5h1409_state), GFP_KERNEL); | 799 | state = kzalloc(sizeof(struct s5h1409_state), GFP_KERNEL); |
| 800 | if (state == NULL) | 800 | if (state == NULL) |
| 801 | goto error; | 801 | goto error; |
| 802 | 802 | ||
diff --git a/drivers/media/dvb/frontends/s5h1411.c b/drivers/media/dvb/frontends/s5h1411.c index 66e2dd6d6fe4..d8adf1e32019 100644 --- a/drivers/media/dvb/frontends/s5h1411.c +++ b/drivers/media/dvb/frontends/s5h1411.c | |||
| @@ -844,7 +844,7 @@ struct dvb_frontend *s5h1411_attach(const struct s5h1411_config *config, | |||
| 844 | u16 reg; | 844 | u16 reg; |
| 845 | 845 | ||
| 846 | /* allocate memory for the internal state */ | 846 | /* allocate memory for the internal state */ |
| 847 | state = kmalloc(sizeof(struct s5h1411_state), GFP_KERNEL); | 847 | state = kzalloc(sizeof(struct s5h1411_state), GFP_KERNEL); |
| 848 | if (state == NULL) | 848 | if (state == NULL) |
| 849 | goto error; | 849 | goto error; |
| 850 | 850 | ||
diff --git a/drivers/media/dvb/frontends/si21xx.c b/drivers/media/dvb/frontends/si21xx.c index 0bd16af8a6cd..9552a22ccffb 100644 --- a/drivers/media/dvb/frontends/si21xx.c +++ b/drivers/media/dvb/frontends/si21xx.c | |||
| @@ -928,7 +928,7 @@ struct dvb_frontend *si21xx_attach(const struct si21xx_config *config, | |||
| 928 | dprintk("%s\n", __func__); | 928 | dprintk("%s\n", __func__); |
| 929 | 929 | ||
| 930 | /* allocate memory for the internal state */ | 930 | /* allocate memory for the internal state */ |
| 931 | state = kmalloc(sizeof(struct si21xx_state), GFP_KERNEL); | 931 | state = kzalloc(sizeof(struct si21xx_state), GFP_KERNEL); |
| 932 | if (state == NULL) | 932 | if (state == NULL) |
| 933 | goto error; | 933 | goto error; |
| 934 | 934 | ||
diff --git a/drivers/media/dvb/frontends/sp8870.c b/drivers/media/dvb/frontends/sp8870.c index 1c9a9b4051b9..b85eb60a893e 100644 --- a/drivers/media/dvb/frontends/sp8870.c +++ b/drivers/media/dvb/frontends/sp8870.c | |||
| @@ -557,7 +557,7 @@ struct dvb_frontend* sp8870_attach(const struct sp8870_config* config, | |||
| 557 | struct sp8870_state* state = NULL; | 557 | struct sp8870_state* state = NULL; |
| 558 | 558 | ||
| 559 | /* allocate memory for the internal state */ | 559 | /* allocate memory for the internal state */ |
| 560 | state = kmalloc(sizeof(struct sp8870_state), GFP_KERNEL); | 560 | state = kzalloc(sizeof(struct sp8870_state), GFP_KERNEL); |
| 561 | if (state == NULL) goto error; | 561 | if (state == NULL) goto error; |
| 562 | 562 | ||
| 563 | /* setup the state */ | 563 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c index 559509ab4dab..4a7c3d842608 100644 --- a/drivers/media/dvb/frontends/sp887x.c +++ b/drivers/media/dvb/frontends/sp887x.c | |||
| @@ -557,7 +557,7 @@ struct dvb_frontend* sp887x_attach(const struct sp887x_config* config, | |||
| 557 | struct sp887x_state* state = NULL; | 557 | struct sp887x_state* state = NULL; |
| 558 | 558 | ||
| 559 | /* allocate memory for the internal state */ | 559 | /* allocate memory for the internal state */ |
| 560 | state = kmalloc(sizeof(struct sp887x_state), GFP_KERNEL); | 560 | state = kzalloc(sizeof(struct sp887x_state), GFP_KERNEL); |
| 561 | if (state == NULL) goto error; | 561 | if (state == NULL) goto error; |
| 562 | 562 | ||
| 563 | /* setup the state */ | 563 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/stv0288.c b/drivers/media/dvb/frontends/stv0288.c index ff1194de34c0..2930a5d6768a 100644 --- a/drivers/media/dvb/frontends/stv0288.c +++ b/drivers/media/dvb/frontends/stv0288.c | |||
| @@ -570,7 +570,7 @@ struct dvb_frontend *stv0288_attach(const struct stv0288_config *config, | |||
| 570 | int id; | 570 | int id; |
| 571 | 571 | ||
| 572 | /* allocate memory for the internal state */ | 572 | /* allocate memory for the internal state */ |
| 573 | state = kmalloc(sizeof(struct stv0288_state), GFP_KERNEL); | 573 | state = kzalloc(sizeof(struct stv0288_state), GFP_KERNEL); |
| 574 | if (state == NULL) | 574 | if (state == NULL) |
| 575 | goto error; | 575 | goto error; |
| 576 | 576 | ||
diff --git a/drivers/media/dvb/frontends/stv0297.c b/drivers/media/dvb/frontends/stv0297.c index 62caf802ed99..4fd7479bb62b 100644 --- a/drivers/media/dvb/frontends/stv0297.c +++ b/drivers/media/dvb/frontends/stv0297.c | |||
| @@ -663,7 +663,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config, | |||
| 663 | struct stv0297_state *state = NULL; | 663 | struct stv0297_state *state = NULL; |
| 664 | 664 | ||
| 665 | /* allocate memory for the internal state */ | 665 | /* allocate memory for the internal state */ |
| 666 | state = kmalloc(sizeof(struct stv0297_state), GFP_KERNEL); | 666 | state = kzalloc(sizeof(struct stv0297_state), GFP_KERNEL); |
| 667 | if (state == NULL) | 667 | if (state == NULL) |
| 668 | goto error; | 668 | goto error; |
| 669 | 669 | ||
diff --git a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c index 6c1cb1973c6e..968874469726 100644 --- a/drivers/media/dvb/frontends/stv0299.c +++ b/drivers/media/dvb/frontends/stv0299.c | |||
| @@ -667,7 +667,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, | |||
| 667 | int id; | 667 | int id; |
| 668 | 668 | ||
| 669 | /* allocate memory for the internal state */ | 669 | /* allocate memory for the internal state */ |
| 670 | state = kmalloc(sizeof(struct stv0299_state), GFP_KERNEL); | 670 | state = kzalloc(sizeof(struct stv0299_state), GFP_KERNEL); |
| 671 | if (state == NULL) goto error; | 671 | if (state == NULL) goto error; |
| 672 | 672 | ||
| 673 | /* setup the state */ | 673 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c index f648fdb64bb7..f5d7b3277a2f 100644 --- a/drivers/media/dvb/frontends/tda10021.c +++ b/drivers/media/dvb/frontends/tda10021.c | |||
| @@ -413,7 +413,7 @@ struct dvb_frontend* tda10021_attach(const struct tda1002x_config* config, | |||
| 413 | u8 id; | 413 | u8 id; |
| 414 | 414 | ||
| 415 | /* allocate memory for the internal state */ | 415 | /* allocate memory for the internal state */ |
| 416 | state = kmalloc(sizeof(struct tda10021_state), GFP_KERNEL); | 416 | state = kzalloc(sizeof(struct tda10021_state), GFP_KERNEL); |
| 417 | if (state == NULL) goto error; | 417 | if (state == NULL) goto error; |
| 418 | 418 | ||
| 419 | /* setup the state */ | 419 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/tda10048.c b/drivers/media/dvb/frontends/tda10048.c index cc8862ce4aae..4e2a7c8b2f62 100644 --- a/drivers/media/dvb/frontends/tda10048.c +++ b/drivers/media/dvb/frontends/tda10048.c | |||
| @@ -1095,7 +1095,7 @@ struct dvb_frontend *tda10048_attach(const struct tda10048_config *config, | |||
| 1095 | dprintk(1, "%s()\n", __func__); | 1095 | dprintk(1, "%s()\n", __func__); |
| 1096 | 1096 | ||
| 1097 | /* allocate memory for the internal state */ | 1097 | /* allocate memory for the internal state */ |
| 1098 | state = kmalloc(sizeof(struct tda10048_state), GFP_KERNEL); | 1098 | state = kzalloc(sizeof(struct tda10048_state), GFP_KERNEL); |
| 1099 | if (state == NULL) | 1099 | if (state == NULL) |
| 1100 | goto error; | 1100 | goto error; |
| 1101 | 1101 | ||
diff --git a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c index 4981cef8b444..f2a8abe0a243 100644 --- a/drivers/media/dvb/frontends/tda1004x.c +++ b/drivers/media/dvb/frontends/tda1004x.c | |||
| @@ -1269,7 +1269,7 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, | |||
| 1269 | int id; | 1269 | int id; |
| 1270 | 1270 | ||
| 1271 | /* allocate memory for the internal state */ | 1271 | /* allocate memory for the internal state */ |
| 1272 | state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); | 1272 | state = kzalloc(sizeof(struct tda1004x_state), GFP_KERNEL); |
| 1273 | if (!state) { | 1273 | if (!state) { |
| 1274 | printk(KERN_ERR "Can't alocate memory for tda10045 state\n"); | 1274 | printk(KERN_ERR "Can't alocate memory for tda10045 state\n"); |
| 1275 | return NULL; | 1275 | return NULL; |
| @@ -1339,7 +1339,7 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, | |||
| 1339 | int id; | 1339 | int id; |
| 1340 | 1340 | ||
| 1341 | /* allocate memory for the internal state */ | 1341 | /* allocate memory for the internal state */ |
| 1342 | state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); | 1342 | state = kzalloc(sizeof(struct tda1004x_state), GFP_KERNEL); |
| 1343 | if (!state) { | 1343 | if (!state) { |
| 1344 | printk(KERN_ERR "Can't alocate memory for tda10046 state\n"); | 1344 | printk(KERN_ERR "Can't alocate memory for tda10046 state\n"); |
| 1345 | return NULL; | 1345 | return NULL; |
diff --git a/drivers/media/dvb/frontends/tda10086.c b/drivers/media/dvb/frontends/tda10086.c index a17ce3c4ad86..f2c8faac6f36 100644 --- a/drivers/media/dvb/frontends/tda10086.c +++ b/drivers/media/dvb/frontends/tda10086.c | |||
| @@ -745,7 +745,7 @@ struct dvb_frontend* tda10086_attach(const struct tda10086_config* config, | |||
| 745 | dprintk ("%s\n", __func__); | 745 | dprintk ("%s\n", __func__); |
| 746 | 746 | ||
| 747 | /* allocate memory for the internal state */ | 747 | /* allocate memory for the internal state */ |
| 748 | state = kmalloc(sizeof(struct tda10086_state), GFP_KERNEL); | 748 | state = kzalloc(sizeof(struct tda10086_state), GFP_KERNEL); |
| 749 | if (!state) | 749 | if (!state) |
| 750 | return NULL; | 750 | return NULL; |
| 751 | 751 | ||
diff --git a/drivers/media/dvb/frontends/tda8083.c b/drivers/media/dvb/frontends/tda8083.c index 5b843b2e67e8..9369f7442f27 100644 --- a/drivers/media/dvb/frontends/tda8083.c +++ b/drivers/media/dvb/frontends/tda8083.c | |||
| @@ -417,7 +417,7 @@ struct dvb_frontend* tda8083_attach(const struct tda8083_config* config, | |||
| 417 | struct tda8083_state* state = NULL; | 417 | struct tda8083_state* state = NULL; |
| 418 | 418 | ||
| 419 | /* allocate memory for the internal state */ | 419 | /* allocate memory for the internal state */ |
| 420 | state = kmalloc(sizeof(struct tda8083_state), GFP_KERNEL); | 420 | state = kzalloc(sizeof(struct tda8083_state), GFP_KERNEL); |
| 421 | if (state == NULL) goto error; | 421 | if (state == NULL) goto error; |
| 422 | 422 | ||
| 423 | /* setup the state */ | 423 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c index a184597f1d9b..6e78e4865515 100644 --- a/drivers/media/dvb/frontends/ves1820.c +++ b/drivers/media/dvb/frontends/ves1820.c | |||
| @@ -374,7 +374,7 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config, | |||
| 374 | struct ves1820_state* state = NULL; | 374 | struct ves1820_state* state = NULL; |
| 375 | 375 | ||
| 376 | /* allocate memory for the internal state */ | 376 | /* allocate memory for the internal state */ |
| 377 | state = kmalloc(sizeof(struct ves1820_state), GFP_KERNEL); | 377 | state = kzalloc(sizeof(struct ves1820_state), GFP_KERNEL); |
| 378 | if (state == NULL) | 378 | if (state == NULL) |
| 379 | goto error; | 379 | goto error; |
| 380 | 380 | ||
diff --git a/drivers/media/dvb/frontends/ves1x93.c b/drivers/media/dvb/frontends/ves1x93.c index bd558960bd87..8d7854c2fb0c 100644 --- a/drivers/media/dvb/frontends/ves1x93.c +++ b/drivers/media/dvb/frontends/ves1x93.c | |||
| @@ -456,7 +456,7 @@ struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, | |||
| 456 | u8 identity; | 456 | u8 identity; |
| 457 | 457 | ||
| 458 | /* allocate memory for the internal state */ | 458 | /* allocate memory for the internal state */ |
| 459 | state = kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL); | 459 | state = kzalloc(sizeof(struct ves1x93_state), GFP_KERNEL); |
| 460 | if (state == NULL) goto error; | 460 | if (state == NULL) goto error; |
| 461 | 461 | ||
| 462 | /* setup the state */ | 462 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/zl10353.c b/drivers/media/dvb/frontends/zl10353.c index 148b6f7f6cb2..66f5c1fb3074 100644 --- a/drivers/media/dvb/frontends/zl10353.c +++ b/drivers/media/dvb/frontends/zl10353.c | |||
| @@ -98,7 +98,6 @@ static int zl10353_read_register(struct zl10353_state *state, u8 reg) | |||
| 98 | static void zl10353_dump_regs(struct dvb_frontend *fe) | 98 | static void zl10353_dump_regs(struct dvb_frontend *fe) |
| 99 | { | 99 | { |
| 100 | struct zl10353_state *state = fe->demodulator_priv; | 100 | struct zl10353_state *state = fe->demodulator_priv; |
| 101 | char buf[52], buf2[4]; | ||
| 102 | int ret; | 101 | int ret; |
| 103 | u8 reg; | 102 | u8 reg; |
| 104 | 103 | ||
| @@ -106,19 +105,18 @@ static void zl10353_dump_regs(struct dvb_frontend *fe) | |||
| 106 | for (reg = 0; ; reg++) { | 105 | for (reg = 0; ; reg++) { |
| 107 | if (reg % 16 == 0) { | 106 | if (reg % 16 == 0) { |
| 108 | if (reg) | 107 | if (reg) |
| 109 | printk(KERN_DEBUG "%s\n", buf); | 108 | printk(KERN_CONT "\n"); |
| 110 | sprintf(buf, "%02x: ", reg); | 109 | printk(KERN_DEBUG "%02x:", reg); |
| 111 | } | 110 | } |
| 112 | ret = zl10353_read_register(state, reg); | 111 | ret = zl10353_read_register(state, reg); |
| 113 | if (ret >= 0) | 112 | if (ret >= 0) |
| 114 | sprintf(buf2, "%02x ", (u8)ret); | 113 | printk(KERN_CONT " %02x", (u8)ret); |
| 115 | else | 114 | else |
| 116 | strcpy(buf2, "-- "); | 115 | printk(KERN_CONT " --"); |
| 117 | strcat(buf, buf2); | ||
| 118 | if (reg == 0xff) | 116 | if (reg == 0xff) |
| 119 | break; | 117 | break; |
| 120 | } | 118 | } |
| 121 | printk(KERN_DEBUG "%s\n", buf); | 119 | printk(KERN_CONT "\n"); |
| 122 | } | 120 | } |
| 123 | 121 | ||
| 124 | static void zl10353_calc_nominal_rate(struct dvb_frontend *fe, | 122 | static void zl10353_calc_nominal_rate(struct dvb_frontend *fe, |
diff --git a/drivers/media/dvb/siano/Kconfig b/drivers/media/dvb/siano/Kconfig index dd863f261672..88847d1dcbb5 100644 --- a/drivers/media/dvb/siano/Kconfig +++ b/drivers/media/dvb/siano/Kconfig | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | config DVB_SIANO_SMS1XXX | 5 | config DVB_SIANO_SMS1XXX |
| 6 | tristate "Siano SMS1XXX USB dongle support" | 6 | tristate "Siano SMS1XXX USB dongle support" |
| 7 | depends on DVB_CORE && USB | 7 | depends on DVB_CORE && USB && INPUT |
| 8 | ---help--- | 8 | ---help--- |
| 9 | Choose Y here if you have a USB dongle with a SMS1XXX chipset. | 9 | Choose Y here if you have a USB dongle with a SMS1XXX chipset. |
| 10 | 10 | ||
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c index d8b15d583bde..0420e2885e75 100644 --- a/drivers/media/dvb/siano/sms-cards.c +++ b/drivers/media/dvb/siano/sms-cards.c | |||
| @@ -116,99 +116,21 @@ static inline void sms_gpio_assign_11xx_default_led_config( | |||
| 116 | 116 | ||
| 117 | int sms_board_event(struct smscore_device_t *coredev, | 117 | int sms_board_event(struct smscore_device_t *coredev, |
| 118 | enum SMS_BOARD_EVENTS gevent) { | 118 | enum SMS_BOARD_EVENTS gevent) { |
| 119 | int board_id = smscore_get_board_id(coredev); | ||
| 120 | struct sms_board *board = sms_get_board(board_id); | ||
| 121 | struct smscore_gpio_config MyGpioConfig; | 119 | struct smscore_gpio_config MyGpioConfig; |
| 122 | 120 | ||
| 123 | sms_gpio_assign_11xx_default_led_config(&MyGpioConfig); | 121 | sms_gpio_assign_11xx_default_led_config(&MyGpioConfig); |
| 124 | 122 | ||
| 125 | switch (gevent) { | 123 | switch (gevent) { |
| 126 | case BOARD_EVENT_POWER_INIT: /* including hotplug */ | 124 | case BOARD_EVENT_POWER_INIT: /* including hotplug */ |
| 127 | switch (board_id) { | ||
| 128 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 129 | /* set I/O and turn off all LEDs */ | ||
| 130 | smscore_gpio_configure(coredev, | ||
| 131 | board->board_cfg.leds_power, | ||
| 132 | &MyGpioConfig); | ||
| 133 | smscore_gpio_set_level(coredev, | ||
| 134 | board->board_cfg.leds_power, 0); | ||
| 135 | smscore_gpio_configure(coredev, board->board_cfg.led0, | ||
| 136 | &MyGpioConfig); | ||
| 137 | smscore_gpio_set_level(coredev, | ||
| 138 | board->board_cfg.led0, 0); | ||
| 139 | smscore_gpio_configure(coredev, board->board_cfg.led1, | ||
| 140 | &MyGpioConfig); | ||
| 141 | smscore_gpio_set_level(coredev, | ||
| 142 | board->board_cfg.led1, 0); | ||
| 143 | break; | ||
| 144 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
| 145 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
| 146 | /* set I/O and turn off LNA */ | ||
| 147 | smscore_gpio_configure(coredev, | ||
| 148 | board->board_cfg.foreign_lna0_ctrl, | ||
| 149 | &MyGpioConfig); | ||
| 150 | smscore_gpio_set_level(coredev, | ||
| 151 | board->board_cfg.foreign_lna0_ctrl, | ||
| 152 | 0); | ||
| 153 | break; | ||
| 154 | } | ||
| 155 | break; /* BOARD_EVENT_BIND */ | 125 | break; /* BOARD_EVENT_BIND */ |
| 156 | 126 | ||
| 157 | case BOARD_EVENT_POWER_SUSPEND: | 127 | case BOARD_EVENT_POWER_SUSPEND: |
| 158 | switch (board_id) { | ||
| 159 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 160 | smscore_gpio_set_level(coredev, | ||
| 161 | board->board_cfg.leds_power, 0); | ||
| 162 | smscore_gpio_set_level(coredev, | ||
| 163 | board->board_cfg.led0, 0); | ||
| 164 | smscore_gpio_set_level(coredev, | ||
| 165 | board->board_cfg.led1, 0); | ||
| 166 | break; | ||
| 167 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
| 168 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
| 169 | smscore_gpio_set_level(coredev, | ||
| 170 | board->board_cfg.foreign_lna0_ctrl, | ||
| 171 | 0); | ||
| 172 | break; | ||
| 173 | } | ||
| 174 | break; /* BOARD_EVENT_POWER_SUSPEND */ | 128 | break; /* BOARD_EVENT_POWER_SUSPEND */ |
| 175 | 129 | ||
| 176 | case BOARD_EVENT_POWER_RESUME: | 130 | case BOARD_EVENT_POWER_RESUME: |
| 177 | switch (board_id) { | ||
| 178 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 179 | smscore_gpio_set_level(coredev, | ||
| 180 | board->board_cfg.leds_power, 1); | ||
| 181 | smscore_gpio_set_level(coredev, | ||
| 182 | board->board_cfg.led0, 1); | ||
| 183 | smscore_gpio_set_level(coredev, | ||
| 184 | board->board_cfg.led1, 0); | ||
| 185 | break; | ||
| 186 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
| 187 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
| 188 | smscore_gpio_set_level(coredev, | ||
| 189 | board->board_cfg.foreign_lna0_ctrl, | ||
| 190 | 1); | ||
| 191 | break; | ||
| 192 | } | ||
| 193 | break; /* BOARD_EVENT_POWER_RESUME */ | 131 | break; /* BOARD_EVENT_POWER_RESUME */ |
| 194 | 132 | ||
| 195 | case BOARD_EVENT_BIND: | 133 | case BOARD_EVENT_BIND: |
| 196 | switch (board_id) { | ||
| 197 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 198 | smscore_gpio_set_level(coredev, | ||
| 199 | board->board_cfg.leds_power, 1); | ||
| 200 | smscore_gpio_set_level(coredev, | ||
| 201 | board->board_cfg.led0, 1); | ||
| 202 | smscore_gpio_set_level(coredev, | ||
| 203 | board->board_cfg.led1, 0); | ||
| 204 | break; | ||
| 205 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||
| 206 | case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||
| 207 | smscore_gpio_set_level(coredev, | ||
| 208 | board->board_cfg.foreign_lna0_ctrl, | ||
| 209 | 1); | ||
| 210 | break; | ||
| 211 | } | ||
| 212 | break; /* BOARD_EVENT_BIND */ | 134 | break; /* BOARD_EVENT_BIND */ |
| 213 | 135 | ||
| 214 | case BOARD_EVENT_SCAN_PROG: | 136 | case BOARD_EVENT_SCAN_PROG: |
| @@ -218,20 +140,8 @@ int sms_board_event(struct smscore_device_t *coredev, | |||
| 218 | case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL: | 140 | case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL: |
| 219 | break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */ | 141 | break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */ |
| 220 | case BOARD_EVENT_FE_LOCK: | 142 | case BOARD_EVENT_FE_LOCK: |
| 221 | switch (board_id) { | ||
| 222 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 223 | smscore_gpio_set_level(coredev, | ||
| 224 | board->board_cfg.led1, 1); | ||
| 225 | break; | ||
| 226 | } | ||
| 227 | break; /* BOARD_EVENT_FE_LOCK */ | 143 | break; /* BOARD_EVENT_FE_LOCK */ |
| 228 | case BOARD_EVENT_FE_UNLOCK: | 144 | case BOARD_EVENT_FE_UNLOCK: |
| 229 | switch (board_id) { | ||
| 230 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 231 | smscore_gpio_set_level(coredev, | ||
| 232 | board->board_cfg.led1, 0); | ||
| 233 | break; | ||
| 234 | } | ||
| 235 | break; /* BOARD_EVENT_FE_UNLOCK */ | 145 | break; /* BOARD_EVENT_FE_UNLOCK */ |
| 236 | case BOARD_EVENT_DEMOD_LOCK: | 146 | case BOARD_EVENT_DEMOD_LOCK: |
| 237 | break; /* BOARD_EVENT_DEMOD_LOCK */ | 147 | break; /* BOARD_EVENT_DEMOD_LOCK */ |
| @@ -248,20 +158,8 @@ int sms_board_event(struct smscore_device_t *coredev, | |||
| 248 | case BOARD_EVENT_RECEPTION_LOST_0: | 158 | case BOARD_EVENT_RECEPTION_LOST_0: |
| 249 | break; /* BOARD_EVENT_RECEPTION_LOST_0 */ | 159 | break; /* BOARD_EVENT_RECEPTION_LOST_0 */ |
| 250 | case BOARD_EVENT_MULTIPLEX_OK: | 160 | case BOARD_EVENT_MULTIPLEX_OK: |
| 251 | switch (board_id) { | ||
| 252 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 253 | smscore_gpio_set_level(coredev, | ||
| 254 | board->board_cfg.led1, 1); | ||
| 255 | break; | ||
| 256 | } | ||
| 257 | break; /* BOARD_EVENT_MULTIPLEX_OK */ | 161 | break; /* BOARD_EVENT_MULTIPLEX_OK */ |
| 258 | case BOARD_EVENT_MULTIPLEX_ERRORS: | 162 | case BOARD_EVENT_MULTIPLEX_ERRORS: |
| 259 | switch (board_id) { | ||
| 260 | case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||
| 261 | smscore_gpio_set_level(coredev, | ||
| 262 | board->board_cfg.led1, 0); | ||
| 263 | break; | ||
| 264 | } | ||
| 265 | break; /* BOARD_EVENT_MULTIPLEX_ERRORS */ | 163 | break; /* BOARD_EVENT_MULTIPLEX_ERRORS */ |
| 266 | 164 | ||
| 267 | default: | 165 | default: |
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c index a246903c3341..bd9ab9d0d12a 100644 --- a/drivers/media/dvb/siano/smscoreapi.c +++ b/drivers/media/dvb/siano/smscoreapi.c | |||
| @@ -816,7 +816,7 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode) | |||
| 816 | 816 | ||
| 817 | sms_debug("set device mode to %d", mode); | 817 | sms_debug("set device mode to %d", mode); |
| 818 | if (coredev->device_flags & SMS_DEVICE_FAMILY2) { | 818 | if (coredev->device_flags & SMS_DEVICE_FAMILY2) { |
| 819 | if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_RAW_TUNER) { | 819 | if (mode < DEVICE_MODE_DVBT || mode >= DEVICE_MODE_RAW_TUNER) { |
| 820 | sms_err("invalid mode specified %d", mode); | 820 | sms_err("invalid mode specified %d", mode); |
| 821 | return -EINVAL; | 821 | return -EINVAL; |
| 822 | } | 822 | } |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 84b6fc15519d..dcf9fa9264bb 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
| @@ -920,6 +920,8 @@ source "drivers/media/video/pwc/Kconfig" | |||
| 920 | config USB_ZR364XX | 920 | config USB_ZR364XX |
| 921 | tristate "USB ZR364XX Camera support" | 921 | tristate "USB ZR364XX Camera support" |
| 922 | depends on VIDEO_V4L2 | 922 | depends on VIDEO_V4L2 |
| 923 | select VIDEOBUF_GEN | ||
| 924 | select VIDEOBUF_VMALLOC | ||
| 923 | ---help--- | 925 | ---help--- |
| 924 | Say Y here if you want to connect this type of camera to your | 926 | Say Y here if you want to connect this type of camera to your |
| 925 | computer's USB port. | 927 | computer's USB port. |
diff --git a/drivers/media/video/bw-qcam.c b/drivers/media/video/bw-qcam.c index 10dbd4a11b30..9e39bc5f7b00 100644 --- a/drivers/media/video/bw-qcam.c +++ b/drivers/media/video/bw-qcam.c | |||
| @@ -992,7 +992,7 @@ static int accept_bwqcam(struct parport *port) | |||
| 992 | 992 | ||
| 993 | if (parport[0] && strncmp(parport[0], "auto", 4) != 0) { | 993 | if (parport[0] && strncmp(parport[0], "auto", 4) != 0) { |
| 994 | /* user gave parport parameters */ | 994 | /* user gave parport parameters */ |
| 995 | for(n=0; parport[n] && n<MAX_CAMS; n++){ | 995 | for (n = 0; n < MAX_CAMS && parport[n]; n++) { |
| 996 | char *ep; | 996 | char *ep; |
| 997 | unsigned long r; | 997 | unsigned long r; |
| 998 | r = simple_strtoul(parport[n], &ep, 0); | 998 | r = simple_strtoul(parport[n], &ep, 0); |
diff --git a/drivers/media/video/cx18/cx18-controls.c b/drivers/media/video/cx18/cx18-controls.c index 5136df198338..93f0dae01350 100644 --- a/drivers/media/video/cx18/cx18-controls.c +++ b/drivers/media/video/cx18/cx18-controls.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 21 | * 02111-1307 USA | 21 | * 02111-1307 USA |
| 22 | */ | 22 | */ |
| 23 | #include <linux/kernel.h> | ||
| 23 | 24 | ||
| 24 | #include "cx18-driver.h" | 25 | #include "cx18-driver.h" |
| 25 | #include "cx18-cards.h" | 26 | #include "cx18-cards.h" |
| @@ -317,7 +318,7 @@ int cx18_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) | |||
| 317 | idx = p.audio_properties & 0x03; | 318 | idx = p.audio_properties & 0x03; |
| 318 | /* The audio clock of the digitizer must match the codec sample | 319 | /* The audio clock of the digitizer must match the codec sample |
| 319 | rate otherwise you get some very strange effects. */ | 320 | rate otherwise you get some very strange effects. */ |
| 320 | if (idx < sizeof(freqs)) | 321 | if (idx < ARRAY_SIZE(freqs)) |
| 321 | cx18_call_all(cx, audio, s_clock_freq, freqs[idx]); | 322 | cx18_call_all(cx, audio, s_clock_freq, freqs[idx]); |
| 322 | return err; | 323 | return err; |
| 323 | } | 324 | } |
diff --git a/drivers/media/video/cx23885/cx23885-417.c b/drivers/media/video/cx23885/cx23885-417.c index e0cf21e0b1bf..1a1048b18f70 100644 --- a/drivers/media/video/cx23885/cx23885-417.c +++ b/drivers/media/video/cx23885/cx23885-417.c | |||
| @@ -1715,6 +1715,8 @@ static struct video_device cx23885_mpeg_template = { | |||
| 1715 | .fops = &mpeg_fops, | 1715 | .fops = &mpeg_fops, |
| 1716 | .ioctl_ops = &mpeg_ioctl_ops, | 1716 | .ioctl_ops = &mpeg_ioctl_ops, |
| 1717 | .minor = -1, | 1717 | .minor = -1, |
| 1718 | .tvnorms = CX23885_NORMS, | ||
| 1719 | .current_norm = V4L2_STD_NTSC_M, | ||
| 1718 | }; | 1720 | }; |
| 1719 | 1721 | ||
| 1720 | void cx23885_417_unregister(struct cx23885_dev *dev) | 1722 | void cx23885_417_unregister(struct cx23885_dev *dev) |
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c index a5cc1c1fc2d6..39465301ec94 100644 --- a/drivers/media/video/cx88/cx88-cards.c +++ b/drivers/media/video/cx88/cx88-cards.c | |||
| @@ -3003,6 +3003,14 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) | |||
| 3003 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | 3003 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: |
| 3004 | ctl->demod = XC3028_FE_OREN538; | 3004 | ctl->demod = XC3028_FE_OREN538; |
| 3005 | break; | 3005 | break; |
| 3006 | case CX88_BOARD_GENIATECH_X8000_MT: | ||
| 3007 | /* FIXME: For this board, the xc3028 never recovers after being | ||
| 3008 | powered down (the reset GPIO probably is not set properly). | ||
| 3009 | We don't have access to the hardware so we cannot determine | ||
| 3010 | which GPIO is used for xc3028, so just disable power xc3028 | ||
| 3011 | power management for now */ | ||
| 3012 | ctl->disable_power_mgmt = 1; | ||
| 3013 | break; | ||
| 3006 | case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: | 3014 | case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: |
| 3007 | case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: | 3015 | case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: |
| 3008 | case CX88_BOARD_PROLINK_PV_8000GT: | 3016 | case CX88_BOARD_PROLINK_PV_8000GT: |
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index c44e87600219..e237b507659b 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
| @@ -501,6 +501,7 @@ static struct zl10353_config cx88_pinnacle_hybrid_pctv = { | |||
| 501 | static struct zl10353_config cx88_geniatech_x8000_mt = { | 501 | static struct zl10353_config cx88_geniatech_x8000_mt = { |
| 502 | .demod_address = (0x1e >> 1), | 502 | .demod_address = (0x1e >> 1), |
| 503 | .no_tuner = 1, | 503 | .no_tuner = 1, |
| 504 | .disable_i2c_gate_ctrl = 1, | ||
| 504 | }; | 505 | }; |
| 505 | 506 | ||
| 506 | static struct s5h1411_config dvico_fusionhdtv7_config = { | 507 | static struct s5h1411_config dvico_fusionhdtv7_config = { |
diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c index da4e3912cd37..7172dcf2a4fa 100644 --- a/drivers/media/video/cx88/cx88-mpeg.c +++ b/drivers/media/video/cx88/cx88-mpeg.c | |||
| @@ -116,6 +116,10 @@ static int cx8802_start_dma(struct cx8802_dev *dev, | |||
| 116 | udelay(100); | 116 | udelay(100); |
| 117 | break; | 117 | break; |
| 118 | case CX88_BOARD_HAUPPAUGE_HVR1300: | 118 | case CX88_BOARD_HAUPPAUGE_HVR1300: |
| 119 | /* Enable MPEG parallel IO and video signal pins */ | ||
| 120 | cx_write(MO_PINMUX_IO, 0x88); | ||
| 121 | cx_write(TS_SOP_STAT, 0); | ||
| 122 | cx_write(TS_VALERR_CNTRL, 0); | ||
| 119 | break; | 123 | break; |
| 120 | case CX88_BOARD_PINNACLE_PCTV_HD_800i: | 124 | case CX88_BOARD_PINNACLE_PCTV_HD_800i: |
| 121 | /* Enable MPEG parallel IO and video signal pins */ | 125 | /* Enable MPEG parallel IO and video signal pins */ |
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 320f1f60276e..ed281f565945 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
| @@ -218,7 +218,7 @@ static struct em28xx_reg_seq silvercrest_reg_seq[] = { | |||
| 218 | struct em28xx_board em28xx_boards[] = { | 218 | struct em28xx_board em28xx_boards[] = { |
| 219 | [EM2750_BOARD_UNKNOWN] = { | 219 | [EM2750_BOARD_UNKNOWN] = { |
| 220 | .name = "EM2710/EM2750/EM2751 webcam grabber", | 220 | .name = "EM2710/EM2750/EM2751 webcam grabber", |
| 221 | .xclk = EM28XX_XCLK_FREQUENCY_48MHZ, | 221 | .xclk = EM28XX_XCLK_FREQUENCY_20MHZ, |
| 222 | .tuner_type = TUNER_ABSENT, | 222 | .tuner_type = TUNER_ABSENT, |
| 223 | .is_webcam = 1, | 223 | .is_webcam = 1, |
| 224 | .input = { { | 224 | .input = { { |
| @@ -622,22 +622,27 @@ struct em28xx_board em28xx_boards[] = { | |||
| 622 | }, | 622 | }, |
| 623 | [EM2861_BOARD_PLEXTOR_PX_TV100U] = { | 623 | [EM2861_BOARD_PLEXTOR_PX_TV100U] = { |
| 624 | .name = "Plextor ConvertX PX-TV100U", | 624 | .name = "Plextor ConvertX PX-TV100U", |
| 625 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
| 626 | .tuner_type = TUNER_TNF_5335MF, | 625 | .tuner_type = TUNER_TNF_5335MF, |
| 626 | .xclk = EM28XX_XCLK_I2S_MSB_TIMING | | ||
| 627 | EM28XX_XCLK_FREQUENCY_12MHZ, | ||
| 627 | .tda9887_conf = TDA9887_PRESENT, | 628 | .tda9887_conf = TDA9887_PRESENT, |
| 628 | .decoder = EM28XX_TVP5150, | 629 | .decoder = EM28XX_TVP5150, |
| 630 | .has_msp34xx = 1, | ||
| 629 | .input = { { | 631 | .input = { { |
| 630 | .type = EM28XX_VMUX_TELEVISION, | 632 | .type = EM28XX_VMUX_TELEVISION, |
| 631 | .vmux = TVP5150_COMPOSITE0, | 633 | .vmux = TVP5150_COMPOSITE0, |
| 632 | .amux = EM28XX_AMUX_LINE_IN, | 634 | .amux = EM28XX_AMUX_LINE_IN, |
| 635 | .gpio = pinnacle_hybrid_pro_analog, | ||
| 633 | }, { | 636 | }, { |
| 634 | .type = EM28XX_VMUX_COMPOSITE1, | 637 | .type = EM28XX_VMUX_COMPOSITE1, |
| 635 | .vmux = TVP5150_COMPOSITE1, | 638 | .vmux = TVP5150_COMPOSITE1, |
| 636 | .amux = EM28XX_AMUX_LINE_IN, | 639 | .amux = EM28XX_AMUX_LINE_IN, |
| 640 | .gpio = pinnacle_hybrid_pro_analog, | ||
| 637 | }, { | 641 | }, { |
| 638 | .type = EM28XX_VMUX_SVIDEO, | 642 | .type = EM28XX_VMUX_SVIDEO, |
| 639 | .vmux = TVP5150_SVIDEO, | 643 | .vmux = TVP5150_SVIDEO, |
| 640 | .amux = EM28XX_AMUX_LINE_IN, | 644 | .amux = EM28XX_AMUX_LINE_IN, |
| 645 | .gpio = pinnacle_hybrid_pro_analog, | ||
| 641 | } }, | 646 | } }, |
| 642 | }, | 647 | }, |
| 643 | 648 | ||
| @@ -1544,6 +1549,8 @@ struct usb_device_id em28xx_id_table[] = { | |||
| 1544 | .driver_info = EM2750_BOARD_UNKNOWN }, | 1549 | .driver_info = EM2750_BOARD_UNKNOWN }, |
| 1545 | { USB_DEVICE(0xeb1a, 0x2800), | 1550 | { USB_DEVICE(0xeb1a, 0x2800), |
| 1546 | .driver_info = EM2800_BOARD_UNKNOWN }, | 1551 | .driver_info = EM2800_BOARD_UNKNOWN }, |
| 1552 | { USB_DEVICE(0xeb1a, 0x2710), | ||
| 1553 | .driver_info = EM2820_BOARD_UNKNOWN }, | ||
| 1547 | { USB_DEVICE(0xeb1a, 0x2820), | 1554 | { USB_DEVICE(0xeb1a, 0x2820), |
| 1548 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1555 | .driver_info = EM2820_BOARD_UNKNOWN }, |
| 1549 | { USB_DEVICE(0xeb1a, 0x2821), | 1556 | { USB_DEVICE(0xeb1a, 0x2821), |
| @@ -1761,6 +1768,7 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1761 | __be16 version_be; | 1768 | __be16 version_be; |
| 1762 | u16 version; | 1769 | u16 version; |
| 1763 | 1770 | ||
| 1771 | /* Micron sensor detection */ | ||
| 1764 | dev->i2c_client.addr = 0xba >> 1; | 1772 | dev->i2c_client.addr = 0xba >> 1; |
| 1765 | cmd = 0; | 1773 | cmd = 0; |
| 1766 | i2c_master_send(&dev->i2c_client, &cmd, 1); | 1774 | i2c_master_send(&dev->i2c_client, &cmd, 1); |
| @@ -1769,15 +1777,27 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1769 | return -EINVAL; | 1777 | return -EINVAL; |
| 1770 | 1778 | ||
| 1771 | version = be16_to_cpu(version_be); | 1779 | version = be16_to_cpu(version_be); |
| 1772 | |||
| 1773 | switch (version) { | 1780 | switch (version) { |
| 1774 | case 0x8243: /* mt9v011 640x480 1.3 Mpix sensor */ | 1781 | case 0x8232: /* mt9v011 640x480 1.3 Mpix sensor */ |
| 1782 | case 0x8243: /* mt9v011 rev B 640x480 1.3 Mpix sensor */ | ||
| 1775 | dev->model = EM2820_BOARD_SILVERCREST_WEBCAM; | 1783 | dev->model = EM2820_BOARD_SILVERCREST_WEBCAM; |
| 1784 | em28xx_set_model(dev); | ||
| 1785 | |||
| 1776 | sensor_name = "mt9v011"; | 1786 | sensor_name = "mt9v011"; |
| 1777 | dev->em28xx_sensor = EM28XX_MT9V011; | 1787 | dev->em28xx_sensor = EM28XX_MT9V011; |
| 1778 | dev->sensor_xres = 640; | 1788 | dev->sensor_xres = 640; |
| 1779 | dev->sensor_yres = 480; | 1789 | dev->sensor_yres = 480; |
| 1780 | dev->sensor_xtal = 6300000; | 1790 | /* |
| 1791 | * FIXME: mt9v011 uses I2S speed as xtal clk - at least with | ||
| 1792 | * the Silvercrest cam I have here for testing - for higher | ||
| 1793 | * resolutions, a high clock cause horizontal artifacts, so we | ||
| 1794 | * need to use a lower xclk frequency. | ||
| 1795 | * Yet, it would be possible to adjust xclk depending on the | ||
| 1796 | * desired resolution, since this affects directly the | ||
| 1797 | * frame rate. | ||
| 1798 | */ | ||
| 1799 | dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ; | ||
| 1800 | dev->sensor_xtal = 4300000; | ||
| 1781 | 1801 | ||
| 1782 | /* probably means GRGB 16 bit bayer */ | 1802 | /* probably means GRGB 16 bit bayer */ |
| 1783 | dev->vinmode = 0x0d; | 1803 | dev->vinmode = 0x0d; |
| @@ -1786,6 +1806,8 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1786 | break; | 1806 | break; |
| 1787 | case 0x8431: | 1807 | case 0x8431: |
| 1788 | dev->model = EM2750_BOARD_UNKNOWN; | 1808 | dev->model = EM2750_BOARD_UNKNOWN; |
| 1809 | em28xx_set_model(dev); | ||
| 1810 | |||
| 1789 | sensor_name = "mt9m001"; | 1811 | sensor_name = "mt9m001"; |
| 1790 | dev->em28xx_sensor = EM28XX_MT9M001; | 1812 | dev->em28xx_sensor = EM28XX_MT9M001; |
| 1791 | em28xx_initialize_mt9m001(dev); | 1813 | em28xx_initialize_mt9m001(dev); |
| @@ -1802,6 +1824,9 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1802 | return -EINVAL; | 1824 | return -EINVAL; |
| 1803 | } | 1825 | } |
| 1804 | 1826 | ||
| 1827 | /* Setup webcam defaults */ | ||
| 1828 | em28xx_pre_card_setup(dev); | ||
| 1829 | |||
| 1805 | em28xx_errdev("Sensor is %s, using model %s entry.\n", | 1830 | em28xx_errdev("Sensor is %s, using model %s entry.\n", |
| 1806 | sensor_name, em28xx_boards[dev->model].name); | 1831 | sensor_name, em28xx_boards[dev->model].name); |
| 1807 | 1832 | ||
| @@ -1813,60 +1838,6 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1813 | */ | 1838 | */ |
| 1814 | void em28xx_pre_card_setup(struct em28xx *dev) | 1839 | void em28xx_pre_card_setup(struct em28xx *dev) |
| 1815 | { | 1840 | { |
| 1816 | int rc; | ||
| 1817 | |||
| 1818 | em28xx_set_model(dev); | ||
| 1819 | |||
| 1820 | em28xx_info("Identified as %s (card=%d)\n", | ||
| 1821 | dev->board.name, dev->model); | ||
| 1822 | |||
| 1823 | /* Set the default GPO/GPIO for legacy devices */ | ||
| 1824 | dev->reg_gpo_num = EM2880_R04_GPO; | ||
| 1825 | dev->reg_gpio_num = EM28XX_R08_GPIO; | ||
| 1826 | |||
| 1827 | dev->wait_after_write = 5; | ||
| 1828 | |||
| 1829 | /* Based on the Chip ID, set the device configuration */ | ||
| 1830 | rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); | ||
| 1831 | if (rc > 0) { | ||
| 1832 | dev->chip_id = rc; | ||
| 1833 | |||
| 1834 | switch (dev->chip_id) { | ||
| 1835 | case CHIP_ID_EM2750: | ||
| 1836 | em28xx_info("chip ID is em2750\n"); | ||
| 1837 | break; | ||
| 1838 | case CHIP_ID_EM2820: | ||
| 1839 | em28xx_info("chip ID is em2710 or em2820\n"); | ||
| 1840 | break; | ||
| 1841 | case CHIP_ID_EM2840: | ||
| 1842 | em28xx_info("chip ID is em2840\n"); | ||
| 1843 | break; | ||
| 1844 | case CHIP_ID_EM2860: | ||
| 1845 | em28xx_info("chip ID is em2860\n"); | ||
| 1846 | break; | ||
| 1847 | case CHIP_ID_EM2870: | ||
| 1848 | em28xx_info("chip ID is em2870\n"); | ||
| 1849 | dev->wait_after_write = 0; | ||
| 1850 | break; | ||
| 1851 | case CHIP_ID_EM2874: | ||
| 1852 | em28xx_info("chip ID is em2874\n"); | ||
| 1853 | dev->reg_gpio_num = EM2874_R80_GPIO; | ||
| 1854 | dev->wait_after_write = 0; | ||
| 1855 | break; | ||
| 1856 | case CHIP_ID_EM2883: | ||
| 1857 | em28xx_info("chip ID is em2882/em2883\n"); | ||
| 1858 | dev->wait_after_write = 0; | ||
| 1859 | break; | ||
| 1860 | default: | ||
| 1861 | em28xx_info("em28xx chip ID = %d\n", dev->chip_id); | ||
| 1862 | } | ||
| 1863 | } | ||
| 1864 | |||
| 1865 | /* Prepopulate cached GPO register content */ | ||
| 1866 | rc = em28xx_read_reg(dev, dev->reg_gpo_num); | ||
| 1867 | if (rc >= 0) | ||
| 1868 | dev->reg_gpo = rc; | ||
| 1869 | |||
| 1870 | /* Set the initial XCLK and I2C clock values based on the board | 1841 | /* Set the initial XCLK and I2C clock values based on the board |
| 1871 | definition */ | 1842 | definition */ |
| 1872 | em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f); | 1843 | em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f); |
| @@ -1876,9 +1847,8 @@ void em28xx_pre_card_setup(struct em28xx *dev) | |||
| 1876 | /* request some modules */ | 1847 | /* request some modules */ |
| 1877 | switch (dev->model) { | 1848 | switch (dev->model) { |
| 1878 | case EM2861_BOARD_PLEXTOR_PX_TV100U: | 1849 | case EM2861_BOARD_PLEXTOR_PX_TV100U: |
| 1879 | /* FIXME guess */ | 1850 | /* Sets the msp34xx I2S speed */ |
| 1880 | /* Turn on analog audio output */ | 1851 | dev->i2s_speed = 2048000; |
| 1881 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); | ||
| 1882 | break; | 1852 | break; |
| 1883 | case EM2861_BOARD_KWORLD_PVRTV_300U: | 1853 | case EM2861_BOARD_KWORLD_PVRTV_300U: |
| 1884 | case EM2880_BOARD_KWORLD_DVB_305U: | 1854 | case EM2880_BOARD_KWORLD_DVB_305U: |
| @@ -2216,7 +2186,20 @@ void em28xx_register_i2c_ir(struct em28xx *dev) | |||
| 2216 | 2186 | ||
| 2217 | void em28xx_card_setup(struct em28xx *dev) | 2187 | void em28xx_card_setup(struct em28xx *dev) |
| 2218 | { | 2188 | { |
| 2219 | em28xx_set_model(dev); | 2189 | /* |
| 2190 | * If the device can be a webcam, seek for a sensor. | ||
| 2191 | * If sensor is not found, then it isn't a webcam. | ||
| 2192 | */ | ||
| 2193 | if (dev->board.is_webcam) { | ||
| 2194 | if (em28xx_hint_sensor(dev) < 0) | ||
| 2195 | dev->board.is_webcam = 0; | ||
| 2196 | else | ||
| 2197 | dev->progressive = 1; | ||
| 2198 | } else | ||
| 2199 | em28xx_set_model(dev); | ||
| 2200 | |||
| 2201 | em28xx_info("Identified as %s (card=%d)\n", | ||
| 2202 | dev->board.name, dev->model); | ||
| 2220 | 2203 | ||
| 2221 | dev->tuner_type = em28xx_boards[dev->model].tuner_type; | 2204 | dev->tuner_type = em28xx_boards[dev->model].tuner_type; |
| 2222 | if (em28xx_boards[dev->model].tuner_addr) | 2205 | if (em28xx_boards[dev->model].tuner_addr) |
| @@ -2290,10 +2273,6 @@ void em28xx_card_setup(struct em28xx *dev) | |||
| 2290 | em28xx_gpio_set(dev, dev->board.tuner_gpio); | 2273 | em28xx_gpio_set(dev, dev->board.tuner_gpio); |
| 2291 | em28xx_set_mode(dev, EM28XX_ANALOG_MODE); | 2274 | em28xx_set_mode(dev, EM28XX_ANALOG_MODE); |
| 2292 | break; | 2275 | break; |
| 2293 | case EM2820_BOARD_SILVERCREST_WEBCAM: | ||
| 2294 | /* FIXME: need to document the registers bellow */ | ||
| 2295 | em28xx_write_reg(dev, 0x0d, 0x42); | ||
| 2296 | em28xx_write_reg(dev, 0x13, 0x08); | ||
| 2297 | } | 2276 | } |
| 2298 | 2277 | ||
| 2299 | if (dev->board.has_snapshot_button) | 2278 | if (dev->board.has_snapshot_button) |
| @@ -2433,7 +2412,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 2433 | int minor) | 2412 | int minor) |
| 2434 | { | 2413 | { |
| 2435 | struct em28xx *dev = *devhandle; | 2414 | struct em28xx *dev = *devhandle; |
| 2436 | int retval = -ENOMEM; | 2415 | int retval; |
| 2437 | int errCode; | 2416 | int errCode; |
| 2438 | 2417 | ||
| 2439 | dev->udev = udev; | 2418 | dev->udev = udev; |
| @@ -2450,6 +2429,58 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 2450 | dev->em28xx_read_reg_req = em28xx_read_reg_req; | 2429 | dev->em28xx_read_reg_req = em28xx_read_reg_req; |
| 2451 | dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800; | 2430 | dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800; |
| 2452 | 2431 | ||
| 2432 | em28xx_set_model(dev); | ||
| 2433 | |||
| 2434 | /* Set the default GPO/GPIO for legacy devices */ | ||
| 2435 | dev->reg_gpo_num = EM2880_R04_GPO; | ||
| 2436 | dev->reg_gpio_num = EM28XX_R08_GPIO; | ||
| 2437 | |||
| 2438 | dev->wait_after_write = 5; | ||
| 2439 | |||
| 2440 | /* Based on the Chip ID, set the device configuration */ | ||
| 2441 | retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); | ||
| 2442 | if (retval > 0) { | ||
| 2443 | dev->chip_id = retval; | ||
| 2444 | |||
| 2445 | switch (dev->chip_id) { | ||
| 2446 | case CHIP_ID_EM2710: | ||
| 2447 | em28xx_info("chip ID is em2710\n"); | ||
| 2448 | break; | ||
| 2449 | case CHIP_ID_EM2750: | ||
| 2450 | em28xx_info("chip ID is em2750\n"); | ||
| 2451 | break; | ||
| 2452 | case CHIP_ID_EM2820: | ||
| 2453 | em28xx_info("chip ID is em2820 (or em2710)\n"); | ||
| 2454 | break; | ||
| 2455 | case CHIP_ID_EM2840: | ||
| 2456 | em28xx_info("chip ID is em2840\n"); | ||
| 2457 | break; | ||
| 2458 | case CHIP_ID_EM2860: | ||
| 2459 | em28xx_info("chip ID is em2860\n"); | ||
| 2460 | break; | ||
| 2461 | case CHIP_ID_EM2870: | ||
| 2462 | em28xx_info("chip ID is em2870\n"); | ||
| 2463 | dev->wait_after_write = 0; | ||
| 2464 | break; | ||
| 2465 | case CHIP_ID_EM2874: | ||
| 2466 | em28xx_info("chip ID is em2874\n"); | ||
| 2467 | dev->reg_gpio_num = EM2874_R80_GPIO; | ||
| 2468 | dev->wait_after_write = 0; | ||
| 2469 | break; | ||
| 2470 | case CHIP_ID_EM2883: | ||
| 2471 | em28xx_info("chip ID is em2882/em2883\n"); | ||
| 2472 | dev->wait_after_write = 0; | ||
| 2473 | break; | ||
| 2474 | default: | ||
| 2475 | em28xx_info("em28xx chip ID = %d\n", dev->chip_id); | ||
| 2476 | } | ||
| 2477 | } | ||
| 2478 | |||
| 2479 | /* Prepopulate cached GPO register content */ | ||
| 2480 | retval = em28xx_read_reg(dev, dev->reg_gpo_num); | ||
| 2481 | if (retval >= 0) | ||
| 2482 | dev->reg_gpo = retval; | ||
| 2483 | |||
| 2453 | em28xx_pre_card_setup(dev); | 2484 | em28xx_pre_card_setup(dev); |
| 2454 | 2485 | ||
| 2455 | if (!dev->board.is_em2800) { | 2486 | if (!dev->board.is_em2800) { |
| @@ -2484,14 +2515,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 2484 | dev->vinmode = 0x10; | 2515 | dev->vinmode = 0x10; |
| 2485 | dev->vinctl = 0x11; | 2516 | dev->vinctl = 0x11; |
| 2486 | 2517 | ||
| 2487 | /* | ||
| 2488 | * If the device can be a webcam, seek for a sensor. | ||
| 2489 | * If sensor is not found, then it isn't a webcam. | ||
| 2490 | */ | ||
| 2491 | if (dev->board.is_webcam) | ||
| 2492 | if (em28xx_hint_sensor(dev) < 0) | ||
| 2493 | dev->board.is_webcam = 0; | ||
| 2494 | |||
| 2495 | /* Do board specific init and eeprom reading */ | 2518 | /* Do board specific init and eeprom reading */ |
| 2496 | em28xx_card_setup(dev); | 2519 | em28xx_card_setup(dev); |
| 2497 | 2520 | ||
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c index 5b78e199abd1..98e140b5d95e 100644 --- a/drivers/media/video/em28xx/em28xx-core.c +++ b/drivers/media/video/em28xx/em28xx-core.c | |||
| @@ -632,6 +632,9 @@ int em28xx_capture_start(struct em28xx *dev, int start) | |||
| 632 | return rc; | 632 | return rc; |
| 633 | } | 633 | } |
| 634 | 634 | ||
| 635 | if (dev->board.is_webcam) | ||
| 636 | rc = em28xx_write_reg(dev, 0x13, 0x0c); | ||
| 637 | |||
| 635 | /* enable video capture */ | 638 | /* enable video capture */ |
| 636 | rc = em28xx_write_reg(dev, 0x48, 0x00); | 639 | rc = em28xx_write_reg(dev, 0x48, 0x00); |
| 637 | 640 | ||
| @@ -720,7 +723,10 @@ int em28xx_resolution_set(struct em28xx *dev) | |||
| 720 | { | 723 | { |
| 721 | int width, height; | 724 | int width, height; |
| 722 | width = norm_maxw(dev); | 725 | width = norm_maxw(dev); |
| 723 | height = norm_maxh(dev) >> 1; | 726 | height = norm_maxh(dev); |
| 727 | |||
| 728 | if (!dev->progressive) | ||
| 729 | height >>= norm_maxh(dev); | ||
| 724 | 730 | ||
| 725 | em28xx_set_outfmt(dev); | 731 | em28xx_set_outfmt(dev); |
| 726 | 732 | ||
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index cf0ac7f2a30d..d603575431b4 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
| @@ -478,7 +478,6 @@ static int dvb_init(struct em28xx *dev) | |||
| 478 | } | 478 | } |
| 479 | break; | 479 | break; |
| 480 | case EM2880_BOARD_KWORLD_DVB_310U: | 480 | case EM2880_BOARD_KWORLD_DVB_310U: |
| 481 | case EM2880_BOARD_EMPIRE_DUAL_TV: | ||
| 482 | dvb->frontend = dvb_attach(zl10353_attach, | 481 | dvb->frontend = dvb_attach(zl10353_attach, |
| 483 | &em28xx_zl10353_with_xc3028, | 482 | &em28xx_zl10353_with_xc3028, |
| 484 | &dev->i2c_adap); | 483 | &dev->i2c_adap); |
| @@ -488,6 +487,7 @@ static int dvb_init(struct em28xx *dev) | |||
| 488 | } | 487 | } |
| 489 | break; | 488 | break; |
| 490 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 489 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
| 490 | case EM2880_BOARD_EMPIRE_DUAL_TV: | ||
| 491 | dvb->frontend = dvb_attach(zl10353_attach, | 491 | dvb->frontend = dvb_attach(zl10353_attach, |
| 492 | &em28xx_zl10353_xc3028_no_i2c_gate, | 492 | &em28xx_zl10353_xc3028_no_i2c_gate, |
| 493 | &dev->i2c_adap); | 493 | &dev->i2c_adap); |
diff --git a/drivers/media/video/em28xx/em28xx-reg.h b/drivers/media/video/em28xx/em28xx-reg.h index a2676d63cfd0..6bf84bd787df 100644 --- a/drivers/media/video/em28xx/em28xx-reg.h +++ b/drivers/media/video/em28xx/em28xx-reg.h | |||
| @@ -176,7 +176,8 @@ | |||
| 176 | 176 | ||
| 177 | /* FIXME: Need to be populated with the other chip ID's */ | 177 | /* FIXME: Need to be populated with the other chip ID's */ |
| 178 | enum em28xx_chip_id { | 178 | enum em28xx_chip_id { |
| 179 | CHIP_ID_EM2820 = 18, /* Also used by em2710 */ | 179 | CHIP_ID_EM2710 = 17, |
| 180 | CHIP_ID_EM2820 = 18, /* Also used by some em2710 */ | ||
| 180 | CHIP_ID_EM2840 = 20, | 181 | CHIP_ID_EM2840 = 20, |
| 181 | CHIP_ID_EM2750 = 33, | 182 | CHIP_ID_EM2750 = 33, |
| 182 | CHIP_ID_EM2860 = 34, | 183 | CHIP_ID_EM2860 = 34, |
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index ff37b4c15f44..ab079d9256c4 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
| @@ -194,15 +194,24 @@ static void em28xx_copy_video(struct em28xx *dev, | |||
| 194 | startread = p; | 194 | startread = p; |
| 195 | remain = len; | 195 | remain = len; |
| 196 | 196 | ||
| 197 | /* Interlaces frame */ | 197 | if (dev->progressive) |
| 198 | if (buf->top_field) | ||
| 199 | fieldstart = outp; | 198 | fieldstart = outp; |
| 200 | else | 199 | else { |
| 201 | fieldstart = outp + bytesperline; | 200 | /* Interlaces two half frames */ |
| 201 | if (buf->top_field) | ||
| 202 | fieldstart = outp; | ||
| 203 | else | ||
| 204 | fieldstart = outp + bytesperline; | ||
| 205 | } | ||
| 202 | 206 | ||
| 203 | linesdone = dma_q->pos / bytesperline; | 207 | linesdone = dma_q->pos / bytesperline; |
| 204 | currlinedone = dma_q->pos % bytesperline; | 208 | currlinedone = dma_q->pos % bytesperline; |
| 205 | offset = linesdone * bytesperline * 2 + currlinedone; | 209 | |
| 210 | if (dev->progressive) | ||
| 211 | offset = linesdone * bytesperline + currlinedone; | ||
| 212 | else | ||
| 213 | offset = linesdone * bytesperline * 2 + currlinedone; | ||
| 214 | |||
| 206 | startwrite = fieldstart + offset; | 215 | startwrite = fieldstart + offset; |
| 207 | lencopy = bytesperline - currlinedone; | 216 | lencopy = bytesperline - currlinedone; |
| 208 | lencopy = lencopy > remain ? remain : lencopy; | 217 | lencopy = lencopy > remain ? remain : lencopy; |
| @@ -376,7 +385,7 @@ static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb) | |||
| 376 | em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2], | 385 | em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2], |
| 377 | len, (p[2] & 1) ? "odd" : "even"); | 386 | len, (p[2] & 1) ? "odd" : "even"); |
| 378 | 387 | ||
| 379 | if (!(p[2] & 1)) { | 388 | if (dev->progressive || !(p[2] & 1)) { |
| 380 | if (buf != NULL) | 389 | if (buf != NULL) |
| 381 | buffer_filled(dev, dma_q, buf); | 390 | buffer_filled(dev, dma_q, buf); |
| 382 | get_next_buf(dma_q, &buf); | 391 | get_next_buf(dma_q, &buf); |
| @@ -689,7 +698,10 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, | |||
| 689 | f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; | 698 | f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; |
| 690 | 699 | ||
| 691 | /* FIXME: TOP? NONE? BOTTOM? ALTENATE? */ | 700 | /* FIXME: TOP? NONE? BOTTOM? ALTENATE? */ |
| 692 | f->fmt.pix.field = dev->interlaced ? | 701 | if (dev->progressive) |
| 702 | f->fmt.pix.field = V4L2_FIELD_NONE; | ||
| 703 | else | ||
| 704 | f->fmt.pix.field = dev->interlaced ? | ||
| 693 | V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP; | 705 | V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP; |
| 694 | 706 | ||
| 695 | mutex_unlock(&dev->lock); | 707 | mutex_unlock(&dev->lock); |
| @@ -753,7 +765,11 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
| 753 | f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3; | 765 | f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3; |
| 754 | f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height; | 766 | f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height; |
| 755 | f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; | 767 | f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; |
| 756 | f->fmt.pix.field = V4L2_FIELD_INTERLACED; | 768 | if (dev->progressive) |
| 769 | f->fmt.pix.field = V4L2_FIELD_NONE; | ||
| 770 | else | ||
| 771 | f->fmt.pix.field = dev->interlaced ? | ||
| 772 | V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP; | ||
| 757 | 773 | ||
| 758 | return 0; | 774 | return 0; |
| 759 | } | 775 | } |
| @@ -846,6 +862,41 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm) | |||
| 846 | return 0; | 862 | return 0; |
| 847 | } | 863 | } |
| 848 | 864 | ||
| 865 | static int vidioc_g_parm(struct file *file, void *priv, | ||
| 866 | struct v4l2_streamparm *p) | ||
| 867 | { | ||
| 868 | struct em28xx_fh *fh = priv; | ||
| 869 | struct em28xx *dev = fh->dev; | ||
| 870 | int rc = 0; | ||
| 871 | |||
| 872 | if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 873 | return -EINVAL; | ||
| 874 | |||
| 875 | if (dev->board.is_webcam) | ||
| 876 | rc = v4l2_device_call_until_err(&dev->v4l2_dev, 0, | ||
| 877 | video, g_parm, p); | ||
| 878 | else | ||
| 879 | v4l2_video_std_frame_period(dev->norm, | ||
| 880 | &p->parm.capture.timeperframe); | ||
| 881 | |||
| 882 | return rc; | ||
| 883 | } | ||
| 884 | |||
| 885 | static int vidioc_s_parm(struct file *file, void *priv, | ||
| 886 | struct v4l2_streamparm *p) | ||
| 887 | { | ||
| 888 | struct em28xx_fh *fh = priv; | ||
| 889 | struct em28xx *dev = fh->dev; | ||
| 890 | |||
| 891 | if (!dev->board.is_webcam) | ||
| 892 | return -EINVAL; | ||
| 893 | |||
| 894 | if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 895 | return -EINVAL; | ||
| 896 | |||
| 897 | return v4l2_device_call_until_err(&dev->v4l2_dev, 0, video, s_parm, p); | ||
| 898 | } | ||
| 899 | |||
| 849 | static const char *iname[] = { | 900 | static const char *iname[] = { |
| 850 | [EM28XX_VMUX_COMPOSITE1] = "Composite1", | 901 | [EM28XX_VMUX_COMPOSITE1] = "Composite1", |
| 851 | [EM28XX_VMUX_COMPOSITE2] = "Composite2", | 902 | [EM28XX_VMUX_COMPOSITE2] = "Composite2", |
| @@ -1624,6 +1675,7 @@ static int em28xx_v4l2_open(struct file *filp) | |||
| 1624 | struct em28xx *dev; | 1675 | struct em28xx *dev; |
| 1625 | enum v4l2_buf_type fh_type; | 1676 | enum v4l2_buf_type fh_type; |
| 1626 | struct em28xx_fh *fh; | 1677 | struct em28xx_fh *fh; |
| 1678 | enum v4l2_field field; | ||
| 1627 | 1679 | ||
| 1628 | dev = em28xx_get_device(minor, &fh_type, &radio); | 1680 | dev = em28xx_get_device(minor, &fh_type, &radio); |
| 1629 | 1681 | ||
| @@ -1665,8 +1717,13 @@ static int em28xx_v4l2_open(struct file *filp) | |||
| 1665 | 1717 | ||
| 1666 | dev->users++; | 1718 | dev->users++; |
| 1667 | 1719 | ||
| 1720 | if (dev->progressive) | ||
| 1721 | field = V4L2_FIELD_NONE; | ||
| 1722 | else | ||
| 1723 | field = V4L2_FIELD_INTERLACED; | ||
| 1724 | |||
| 1668 | videobuf_queue_vmalloc_init(&fh->vb_vidq, &em28xx_video_qops, | 1725 | videobuf_queue_vmalloc_init(&fh->vb_vidq, &em28xx_video_qops, |
| 1669 | NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED, | 1726 | NULL, &dev->slock, fh->type, field, |
| 1670 | sizeof(struct em28xx_buffer), fh); | 1727 | sizeof(struct em28xx_buffer), fh); |
| 1671 | 1728 | ||
| 1672 | mutex_unlock(&dev->lock); | 1729 | mutex_unlock(&dev->lock); |
| @@ -1885,6 +1942,8 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = { | |||
| 1885 | .vidioc_qbuf = vidioc_qbuf, | 1942 | .vidioc_qbuf = vidioc_qbuf, |
| 1886 | .vidioc_dqbuf = vidioc_dqbuf, | 1943 | .vidioc_dqbuf = vidioc_dqbuf, |
| 1887 | .vidioc_s_std = vidioc_s_std, | 1944 | .vidioc_s_std = vidioc_s_std, |
| 1945 | .vidioc_g_parm = vidioc_g_parm, | ||
| 1946 | .vidioc_s_parm = vidioc_s_parm, | ||
| 1888 | .vidioc_enum_input = vidioc_enum_input, | 1947 | .vidioc_enum_input = vidioc_enum_input, |
| 1889 | .vidioc_g_input = vidioc_g_input, | 1948 | .vidioc_g_input = vidioc_g_input, |
| 1890 | .vidioc_s_input = vidioc_s_input, | 1949 | .vidioc_s_input = vidioc_s_input, |
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 45bd513f62dc..8c2dc38bca9f 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
| @@ -484,6 +484,9 @@ struct em28xx { | |||
| 484 | int sensor_xres, sensor_yres; | 484 | int sensor_xres, sensor_yres; |
| 485 | int sensor_xtal; | 485 | int sensor_xtal; |
| 486 | 486 | ||
| 487 | /* Allows progressive (e. g. non-interlaced) mode */ | ||
| 488 | int progressive; | ||
| 489 | |||
| 487 | /* Vinmode/Vinctl used at the driver */ | 490 | /* Vinmode/Vinctl used at the driver */ |
| 488 | int vinmode, vinctl; | 491 | int vinmode, vinctl; |
| 489 | 492 | ||
diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c index ccd47f57f42c..d678765cbba2 100644 --- a/drivers/media/video/hdpvr/hdpvr-video.c +++ b/drivers/media/video/hdpvr/hdpvr-video.c | |||
| @@ -1220,6 +1220,8 @@ static const struct video_device hdpvr_video_template = { | |||
| 1220 | V4L2_STD_PAL_G | V4L2_STD_PAL_H | V4L2_STD_PAL_I | | 1220 | V4L2_STD_PAL_G | V4L2_STD_PAL_H | V4L2_STD_PAL_I | |
| 1221 | V4L2_STD_PAL_D | V4L2_STD_PAL_M | V4L2_STD_PAL_N | | 1221 | V4L2_STD_PAL_D | V4L2_STD_PAL_M | V4L2_STD_PAL_N | |
| 1222 | V4L2_STD_PAL_60, | 1222 | V4L2_STD_PAL_60, |
| 1223 | .current_norm = V4L2_STD_NTSC | V4L2_STD_PAL_M | | ||
| 1224 | V4L2_STD_PAL_60, | ||
| 1223 | }; | 1225 | }; |
| 1224 | 1226 | ||
| 1225 | int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent, | 1227 | int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent, |
diff --git a/drivers/media/video/ivtv/ivtv-controls.c b/drivers/media/video/ivtv/ivtv-controls.c index a3b77ed3f089..4a9c8ce0ecb3 100644 --- a/drivers/media/video/ivtv/ivtv-controls.c +++ b/drivers/media/video/ivtv/ivtv-controls.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | along with this program; if not, write to the Free Software | 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 | 18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | */ | 19 | */ |
| 20 | #include <linux/kernel.h> | ||
| 20 | 21 | ||
| 21 | #include "ivtv-driver.h" | 22 | #include "ivtv-driver.h" |
| 22 | #include "ivtv-cards.h" | 23 | #include "ivtv-cards.h" |
| @@ -281,7 +282,7 @@ int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) | |||
| 281 | idx = p.audio_properties & 0x03; | 282 | idx = p.audio_properties & 0x03; |
| 282 | /* The audio clock of the digitizer must match the codec sample | 283 | /* The audio clock of the digitizer must match the codec sample |
| 283 | rate otherwise you get some very strange effects. */ | 284 | rate otherwise you get some very strange effects. */ |
| 284 | if (idx < sizeof(freqs)) | 285 | if (idx < ARRAY_SIZE(freqs)) |
| 285 | ivtv_call_all(itv, audio, s_clock_freq, freqs[idx]); | 286 | ivtv_call_all(itv, audio, s_clock_freq, freqs[idx]); |
| 286 | return err; | 287 | return err; |
| 287 | } | 288 | } |
diff --git a/drivers/media/video/mt9v011.c b/drivers/media/video/mt9v011.c index b2260de645f0..cc85f77a5706 100644 --- a/drivers/media/video/mt9v011.c +++ b/drivers/media/video/mt9v011.c | |||
| @@ -52,13 +52,34 @@ static struct v4l2_queryctrl mt9v011_qctrl[] = { | |||
| 52 | .step = 1, | 52 | .step = 1, |
| 53 | .default_value = 0, | 53 | .default_value = 0, |
| 54 | .flags = 0, | 54 | .flags = 0, |
| 55 | }, | 55 | }, { |
| 56 | .id = V4L2_CID_HFLIP, | ||
| 57 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 58 | .name = "Mirror", | ||
| 59 | .minimum = 0, | ||
| 60 | .maximum = 1, | ||
| 61 | .step = 1, | ||
| 62 | .default_value = 0, | ||
| 63 | .flags = 0, | ||
| 64 | }, { | ||
| 65 | .id = V4L2_CID_VFLIP, | ||
| 66 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 67 | .name = "Vflip", | ||
| 68 | .minimum = 0, | ||
| 69 | .maximum = 1, | ||
| 70 | .step = 1, | ||
| 71 | .default_value = 0, | ||
| 72 | .flags = 0, | ||
| 73 | }, { | ||
| 74 | } | ||
| 56 | }; | 75 | }; |
| 57 | 76 | ||
| 58 | struct mt9v011 { | 77 | struct mt9v011 { |
| 59 | struct v4l2_subdev sd; | 78 | struct v4l2_subdev sd; |
| 60 | unsigned width, height; | 79 | unsigned width, height; |
| 61 | unsigned xtal; | 80 | unsigned xtal; |
| 81 | unsigned hflip:1; | ||
| 82 | unsigned vflip:1; | ||
| 62 | 83 | ||
| 63 | u16 global_gain, red_bal, blue_bal; | 84 | u16 global_gain, red_bal, blue_bal; |
| 64 | }; | 85 | }; |
| @@ -131,7 +152,6 @@ static const struct i2c_reg_value mt9v011_init_default[] = { | |||
| 131 | 152 | ||
| 132 | { R0A_MT9V011_CLK_SPEED, 0x0000 }, | 153 | { R0A_MT9V011_CLK_SPEED, 0x0000 }, |
| 133 | { R1E_MT9V011_DIGITAL_ZOOM, 0x0000 }, | 154 | { R1E_MT9V011_DIGITAL_ZOOM, 0x0000 }, |
| 134 | { R20_MT9V011_READ_MODE, 0x1000 }, | ||
| 135 | 155 | ||
| 136 | { R07_MT9V011_OUT_CTRL, 0x0002 }, /* chip enable */ | 156 | { R07_MT9V011_OUT_CTRL, 0x0002 }, /* chip enable */ |
| 137 | }; | 157 | }; |
| @@ -156,7 +176,7 @@ static void set_balance(struct v4l2_subdev *sd) | |||
| 156 | mt9v011_write(sd, R2D_MT9V011_RED_GAIN, red_gain); | 176 | mt9v011_write(sd, R2D_MT9V011_RED_GAIN, red_gain); |
| 157 | } | 177 | } |
| 158 | 178 | ||
| 159 | static void calc_fps(struct v4l2_subdev *sd) | 179 | static void calc_fps(struct v4l2_subdev *sd, u32 *numerator, u32 *denominator) |
| 160 | { | 180 | { |
| 161 | struct mt9v011 *core = to_mt9v011(sd); | 181 | struct mt9v011 *core = to_mt9v011(sd); |
| 162 | unsigned height, width, hblank, vblank, speed; | 182 | unsigned height, width, hblank, vblank, speed; |
| @@ -179,6 +199,51 @@ static void calc_fps(struct v4l2_subdev *sd) | |||
| 179 | 199 | ||
| 180 | v4l2_dbg(1, debug, sd, "Programmed to %u.%03u fps (%d pixel clcks)\n", | 200 | v4l2_dbg(1, debug, sd, "Programmed to %u.%03u fps (%d pixel clcks)\n", |
| 181 | tmp / 1000, tmp % 1000, t_time); | 201 | tmp / 1000, tmp % 1000, t_time); |
| 202 | |||
| 203 | if (numerator && denominator) { | ||
| 204 | *numerator = 1000; | ||
| 205 | *denominator = (u32)frames_per_ms; | ||
| 206 | } | ||
| 207 | } | ||
| 208 | |||
| 209 | static u16 calc_speed(struct v4l2_subdev *sd, u32 numerator, u32 denominator) | ||
| 210 | { | ||
| 211 | struct mt9v011 *core = to_mt9v011(sd); | ||
| 212 | unsigned height, width, hblank, vblank; | ||
| 213 | unsigned row_time, line_time; | ||
| 214 | u64 t_time, speed; | ||
| 215 | |||
| 216 | /* Avoid bogus calculus */ | ||
| 217 | if (!numerator || !denominator) | ||
| 218 | return 0; | ||
| 219 | |||
| 220 | height = mt9v011_read(sd, R03_MT9V011_HEIGHT); | ||
| 221 | width = mt9v011_read(sd, R04_MT9V011_WIDTH); | ||
| 222 | hblank = mt9v011_read(sd, R05_MT9V011_HBLANK); | ||
| 223 | vblank = mt9v011_read(sd, R06_MT9V011_VBLANK); | ||
| 224 | |||
| 225 | row_time = width + 113 + hblank; | ||
| 226 | line_time = height + vblank + 1; | ||
| 227 | |||
| 228 | t_time = core->xtal * ((u64)numerator); | ||
| 229 | /* round to the closest value */ | ||
| 230 | t_time += denominator / 2; | ||
| 231 | do_div(t_time, denominator); | ||
| 232 | |||
| 233 | speed = t_time; | ||
| 234 | do_div(speed, row_time * line_time); | ||
| 235 | |||
| 236 | /* Avoid having a negative value for speed */ | ||
| 237 | if (speed < 2) | ||
| 238 | speed = 0; | ||
| 239 | else | ||
| 240 | speed -= 2; | ||
| 241 | |||
| 242 | /* Avoid speed overflow */ | ||
| 243 | if (speed > 15) | ||
| 244 | return 15; | ||
| 245 | |||
| 246 | return (u16)speed; | ||
| 182 | } | 247 | } |
| 183 | 248 | ||
| 184 | static void set_res(struct v4l2_subdev *sd) | 249 | static void set_res(struct v4l2_subdev *sd) |
| @@ -207,9 +272,23 @@ static void set_res(struct v4l2_subdev *sd) | |||
| 207 | mt9v011_write(sd, R03_MT9V011_HEIGHT, core->height); | 272 | mt9v011_write(sd, R03_MT9V011_HEIGHT, core->height); |
| 208 | mt9v011_write(sd, R06_MT9V011_VBLANK, 508 - core->height); | 273 | mt9v011_write(sd, R06_MT9V011_VBLANK, 508 - core->height); |
| 209 | 274 | ||
| 210 | calc_fps(sd); | 275 | calc_fps(sd, NULL, NULL); |
| 211 | }; | 276 | }; |
| 212 | 277 | ||
| 278 | static void set_read_mode(struct v4l2_subdev *sd) | ||
| 279 | { | ||
| 280 | struct mt9v011 *core = to_mt9v011(sd); | ||
| 281 | unsigned mode = 0x1000; | ||
| 282 | |||
| 283 | if (core->hflip) | ||
| 284 | mode |= 0x4000; | ||
| 285 | |||
| 286 | if (core->vflip) | ||
| 287 | mode |= 0x8000; | ||
| 288 | |||
| 289 | mt9v011_write(sd, R20_MT9V011_READ_MODE, mode); | ||
| 290 | } | ||
| 291 | |||
| 213 | static int mt9v011_reset(struct v4l2_subdev *sd, u32 val) | 292 | static int mt9v011_reset(struct v4l2_subdev *sd, u32 val) |
| 214 | { | 293 | { |
| 215 | int i; | 294 | int i; |
| @@ -220,6 +299,7 @@ static int mt9v011_reset(struct v4l2_subdev *sd, u32 val) | |||
| 220 | 299 | ||
| 221 | set_balance(sd); | 300 | set_balance(sd); |
| 222 | set_res(sd); | 301 | set_res(sd); |
| 302 | set_read_mode(sd); | ||
| 223 | 303 | ||
| 224 | return 0; | 304 | return 0; |
| 225 | }; | 305 | }; |
| @@ -240,6 +320,12 @@ static int mt9v011_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) | |||
| 240 | case V4L2_CID_BLUE_BALANCE: | 320 | case V4L2_CID_BLUE_BALANCE: |
| 241 | ctrl->value = core->blue_bal; | 321 | ctrl->value = core->blue_bal; |
| 242 | return 0; | 322 | return 0; |
| 323 | case V4L2_CID_HFLIP: | ||
| 324 | ctrl->value = core->hflip ? 1 : 0; | ||
| 325 | return 0; | ||
| 326 | case V4L2_CID_VFLIP: | ||
| 327 | ctrl->value = core->vflip ? 1 : 0; | ||
| 328 | return 0; | ||
| 243 | } | 329 | } |
| 244 | return -EINVAL; | 330 | return -EINVAL; |
| 245 | } | 331 | } |
| @@ -288,6 +374,14 @@ static int mt9v011_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) | |||
| 288 | case V4L2_CID_BLUE_BALANCE: | 374 | case V4L2_CID_BLUE_BALANCE: |
| 289 | core->blue_bal = ctrl->value; | 375 | core->blue_bal = ctrl->value; |
| 290 | break; | 376 | break; |
| 377 | case V4L2_CID_HFLIP: | ||
| 378 | core->hflip = ctrl->value; | ||
| 379 | set_read_mode(sd); | ||
| 380 | return 0; | ||
| 381 | case V4L2_CID_VFLIP: | ||
| 382 | core->vflip = ctrl->value; | ||
| 383 | set_read_mode(sd); | ||
| 384 | return 0; | ||
| 291 | default: | 385 | default: |
| 292 | return -EINVAL; | 386 | return -EINVAL; |
| 293 | } | 387 | } |
| @@ -322,6 +416,44 @@ static int mt9v011_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt) | |||
| 322 | return 0; | 416 | return 0; |
| 323 | } | 417 | } |
| 324 | 418 | ||
| 419 | static int mt9v011_g_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms) | ||
| 420 | { | ||
| 421 | struct v4l2_captureparm *cp = &parms->parm.capture; | ||
| 422 | |||
| 423 | if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 424 | return -EINVAL; | ||
| 425 | |||
| 426 | memset(cp, 0, sizeof(struct v4l2_captureparm)); | ||
| 427 | cp->capability = V4L2_CAP_TIMEPERFRAME; | ||
| 428 | calc_fps(sd, | ||
| 429 | &cp->timeperframe.numerator, | ||
| 430 | &cp->timeperframe.denominator); | ||
| 431 | |||
| 432 | return 0; | ||
| 433 | } | ||
| 434 | |||
| 435 | static int mt9v011_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms) | ||
| 436 | { | ||
| 437 | struct v4l2_captureparm *cp = &parms->parm.capture; | ||
| 438 | struct v4l2_fract *tpf = &cp->timeperframe; | ||
| 439 | u16 speed; | ||
| 440 | |||
| 441 | if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 442 | return -EINVAL; | ||
| 443 | if (cp->extendedmode != 0) | ||
| 444 | return -EINVAL; | ||
| 445 | |||
| 446 | speed = calc_speed(sd, tpf->numerator, tpf->denominator); | ||
| 447 | |||
| 448 | mt9v011_write(sd, R0A_MT9V011_CLK_SPEED, speed); | ||
| 449 | v4l2_dbg(1, debug, sd, "Setting speed to %d\n", speed); | ||
| 450 | |||
| 451 | /* Recalculate and update fps info */ | ||
| 452 | calc_fps(sd, &tpf->numerator, &tpf->denominator); | ||
| 453 | |||
| 454 | return 0; | ||
| 455 | } | ||
| 456 | |||
| 325 | static int mt9v011_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt) | 457 | static int mt9v011_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt) |
| 326 | { | 458 | { |
| 327 | struct v4l2_pix_format *pix = &fmt->fmt.pix; | 459 | struct v4l2_pix_format *pix = &fmt->fmt.pix; |
| @@ -393,10 +525,13 @@ static int mt9v011_s_register(struct v4l2_subdev *sd, | |||
| 393 | static int mt9v011_g_chip_ident(struct v4l2_subdev *sd, | 525 | static int mt9v011_g_chip_ident(struct v4l2_subdev *sd, |
| 394 | struct v4l2_dbg_chip_ident *chip) | 526 | struct v4l2_dbg_chip_ident *chip) |
| 395 | { | 527 | { |
| 528 | u16 version; | ||
| 396 | struct i2c_client *client = v4l2_get_subdevdata(sd); | 529 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
| 397 | 530 | ||
| 531 | version = mt9v011_read(sd, R00_MT9V011_CHIP_VERSION); | ||
| 532 | |||
| 398 | return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_MT9V011, | 533 | return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_MT9V011, |
| 399 | MT9V011_VERSION); | 534 | version); |
| 400 | } | 535 | } |
| 401 | 536 | ||
| 402 | static const struct v4l2_subdev_core_ops mt9v011_core_ops = { | 537 | static const struct v4l2_subdev_core_ops mt9v011_core_ops = { |
| @@ -416,6 +551,8 @@ static const struct v4l2_subdev_video_ops mt9v011_video_ops = { | |||
| 416 | .enum_fmt = mt9v011_enum_fmt, | 551 | .enum_fmt = mt9v011_enum_fmt, |
| 417 | .try_fmt = mt9v011_try_fmt, | 552 | .try_fmt = mt9v011_try_fmt, |
| 418 | .s_fmt = mt9v011_s_fmt, | 553 | .s_fmt = mt9v011_s_fmt, |
| 554 | .g_parm = mt9v011_g_parm, | ||
| 555 | .s_parm = mt9v011_s_parm, | ||
| 419 | }; | 556 | }; |
| 420 | 557 | ||
| 421 | static const struct v4l2_subdev_ops mt9v011_ops = { | 558 | static const struct v4l2_subdev_ops mt9v011_ops = { |
| @@ -449,8 +586,9 @@ static int mt9v011_probe(struct i2c_client *c, | |||
| 449 | 586 | ||
| 450 | /* Check if the sensor is really a MT9V011 */ | 587 | /* Check if the sensor is really a MT9V011 */ |
| 451 | version = mt9v011_read(sd, R00_MT9V011_CHIP_VERSION); | 588 | version = mt9v011_read(sd, R00_MT9V011_CHIP_VERSION); |
| 452 | if (version != MT9V011_VERSION) { | 589 | if ((version != MT9V011_VERSION) && |
| 453 | v4l2_info(sd, "*** unknown micron chip detected (0x%04x.\n", | 590 | (version != MT9V011_REV_B_VERSION)) { |
| 591 | v4l2_info(sd, "*** unknown micron chip detected (0x%04x).\n", | ||
| 454 | version); | 592 | version); |
| 455 | kfree(core); | 593 | kfree(core); |
| 456 | return -EINVAL; | 594 | return -EINVAL; |
| @@ -461,8 +599,8 @@ static int mt9v011_probe(struct i2c_client *c, | |||
| 461 | core->height = 480; | 599 | core->height = 480; |
| 462 | core->xtal = 27000000; /* Hz */ | 600 | core->xtal = 27000000; /* Hz */ |
| 463 | 601 | ||
| 464 | v4l_info(c, "chip found @ 0x%02x (%s)\n", | 602 | v4l_info(c, "chip found @ 0x%02x (%s - chip version 0x%04x)\n", |
| 465 | c->addr << 1, c->adapter->name); | 603 | c->addr << 1, c->adapter->name, version); |
| 466 | 604 | ||
| 467 | return 0; | 605 | return 0; |
| 468 | } | 606 | } |
diff --git a/drivers/media/video/mt9v011.h b/drivers/media/video/mt9v011.h index 9e443ee30558..3350fd6083c3 100644 --- a/drivers/media/video/mt9v011.h +++ b/drivers/media/video/mt9v011.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #define R35_MT9V011_GLOBAL_GAIN 0x35 | 30 | #define R35_MT9V011_GLOBAL_GAIN 0x35 |
| 31 | #define RF1_MT9V011_CHIP_ENABLE 0xf1 | 31 | #define RF1_MT9V011_CHIP_ENABLE 0xf1 |
| 32 | 32 | ||
| 33 | #define MT9V011_VERSION 0x8243 | 33 | #define MT9V011_VERSION 0x8232 |
| 34 | #define MT9V011_REV_B_VERSION 0x8243 | ||
| 34 | 35 | ||
| 35 | #endif | 36 | #endif |
diff --git a/drivers/media/video/mx1_camera.c b/drivers/media/video/mx1_camera.c index 2d075205bdfe..736c31d23194 100644 --- a/drivers/media/video/mx1_camera.c +++ b/drivers/media/video/mx1_camera.c | |||
| @@ -234,6 +234,7 @@ static int mx1_camera_setup_dma(struct mx1_camera_dev *pcdev) | |||
| 234 | return ret; | 234 | return ret; |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | /* Called under spinlock_irqsave(&pcdev->lock, ...) */ | ||
| 237 | static void mx1_videobuf_queue(struct videobuf_queue *vq, | 238 | static void mx1_videobuf_queue(struct videobuf_queue *vq, |
| 238 | struct videobuf_buffer *vb) | 239 | struct videobuf_buffer *vb) |
| 239 | { | 240 | { |
| @@ -241,13 +242,10 @@ static void mx1_videobuf_queue(struct videobuf_queue *vq, | |||
| 241 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 242 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
| 242 | struct mx1_camera_dev *pcdev = ici->priv; | 243 | struct mx1_camera_dev *pcdev = ici->priv; |
| 243 | struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb); | 244 | struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb); |
| 244 | unsigned long flags; | ||
| 245 | 245 | ||
| 246 | dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__, | 246 | dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__, |
| 247 | vb, vb->baddr, vb->bsize); | 247 | vb, vb->baddr, vb->bsize); |
| 248 | 248 | ||
| 249 | spin_lock_irqsave(&pcdev->lock, flags); | ||
| 250 | |||
| 251 | list_add_tail(&vb->queue, &pcdev->capture); | 249 | list_add_tail(&vb->queue, &pcdev->capture); |
| 252 | 250 | ||
| 253 | vb->state = VIDEOBUF_ACTIVE; | 251 | vb->state = VIDEOBUF_ACTIVE; |
| @@ -264,8 +262,6 @@ static void mx1_videobuf_queue(struct videobuf_queue *vq, | |||
| 264 | __raw_writel(temp, pcdev->base + CSICR1); | 262 | __raw_writel(temp, pcdev->base + CSICR1); |
| 265 | } | 263 | } |
| 266 | } | 264 | } |
| 267 | |||
| 268 | spin_unlock_irqrestore(&pcdev->lock, flags); | ||
| 269 | } | 265 | } |
| 270 | 266 | ||
| 271 | static void mx1_videobuf_release(struct videobuf_queue *vq, | 267 | static void mx1_videobuf_release(struct videobuf_queue *vq, |
diff --git a/drivers/media/video/mx3_camera.c b/drivers/media/video/mx3_camera.c index e605c076ed89..9770cb7932ca 100644 --- a/drivers/media/video/mx3_camera.c +++ b/drivers/media/video/mx3_camera.c | |||
| @@ -332,7 +332,10 @@ static enum pixel_fmt fourcc_to_ipu_pix(__u32 fourcc) | |||
| 332 | } | 332 | } |
| 333 | } | 333 | } |
| 334 | 334 | ||
| 335 | /* Called with .vb_lock held */ | 335 | /* |
| 336 | * Called with .vb_lock mutex held and | ||
| 337 | * under spinlock_irqsave(&mx3_cam->lock, ...) | ||
| 338 | */ | ||
| 336 | static void mx3_videobuf_queue(struct videobuf_queue *vq, | 339 | static void mx3_videobuf_queue(struct videobuf_queue *vq, |
| 337 | struct videobuf_buffer *vb) | 340 | struct videobuf_buffer *vb) |
| 338 | { | 341 | { |
| @@ -346,7 +349,8 @@ static void mx3_videobuf_queue(struct videobuf_queue *vq, | |||
| 346 | struct idmac_video_param *video = &ichan->params.video; | 349 | struct idmac_video_param *video = &ichan->params.video; |
| 347 | const struct soc_camera_data_format *data_fmt = icd->current_fmt; | 350 | const struct soc_camera_data_format *data_fmt = icd->current_fmt; |
| 348 | dma_cookie_t cookie; | 351 | dma_cookie_t cookie; |
| 349 | unsigned long flags; | 352 | |
| 353 | BUG_ON(!irqs_disabled()); | ||
| 350 | 354 | ||
| 351 | /* This is the configuration of one sg-element */ | 355 | /* This is the configuration of one sg-element */ |
| 352 | video->out_pixel_fmt = fourcc_to_ipu_pix(data_fmt->fourcc); | 356 | video->out_pixel_fmt = fourcc_to_ipu_pix(data_fmt->fourcc); |
| @@ -359,8 +363,6 @@ static void mx3_videobuf_queue(struct videobuf_queue *vq, | |||
| 359 | memset((void *)vb->baddr, 0xaa, vb->bsize); | 363 | memset((void *)vb->baddr, 0xaa, vb->bsize); |
| 360 | #endif | 364 | #endif |
| 361 | 365 | ||
| 362 | spin_lock_irqsave(&mx3_cam->lock, flags); | ||
| 363 | |||
| 364 | list_add_tail(&vb->queue, &mx3_cam->capture); | 366 | list_add_tail(&vb->queue, &mx3_cam->capture); |
| 365 | 367 | ||
| 366 | if (!mx3_cam->active) { | 368 | if (!mx3_cam->active) { |
| @@ -370,24 +372,23 @@ static void mx3_videobuf_queue(struct videobuf_queue *vq, | |||
| 370 | vb->state = VIDEOBUF_QUEUED; | 372 | vb->state = VIDEOBUF_QUEUED; |
| 371 | } | 373 | } |
| 372 | 374 | ||
| 373 | spin_unlock_irqrestore(&mx3_cam->lock, flags); | 375 | spin_unlock_irq(&mx3_cam->lock); |
| 374 | 376 | ||
| 375 | cookie = txd->tx_submit(txd); | 377 | cookie = txd->tx_submit(txd); |
| 376 | dev_dbg(&icd->dev, "Submitted cookie %d DMA 0x%08x\n", cookie, sg_dma_address(&buf->sg)); | 378 | dev_dbg(&icd->dev, "Submitted cookie %d DMA 0x%08x\n", cookie, sg_dma_address(&buf->sg)); |
| 379 | |||
| 380 | spin_lock_irq(&mx3_cam->lock); | ||
| 381 | |||
| 377 | if (cookie >= 0) | 382 | if (cookie >= 0) |
| 378 | return; | 383 | return; |
| 379 | 384 | ||
| 380 | /* Submit error */ | 385 | /* Submit error */ |
| 381 | vb->state = VIDEOBUF_PREPARED; | 386 | vb->state = VIDEOBUF_PREPARED; |
| 382 | 387 | ||
| 383 | spin_lock_irqsave(&mx3_cam->lock, flags); | ||
| 384 | |||
| 385 | list_del_init(&vb->queue); | 388 | list_del_init(&vb->queue); |
| 386 | 389 | ||
| 387 | if (mx3_cam->active == buf) | 390 | if (mx3_cam->active == buf) |
| 388 | mx3_cam->active = NULL; | 391 | mx3_cam->active = NULL; |
| 389 | |||
| 390 | spin_unlock_irqrestore(&mx3_cam->lock, flags); | ||
| 391 | } | 392 | } |
| 392 | 393 | ||
| 393 | /* Called with .vb_lock held */ | 394 | /* Called with .vb_lock held */ |
diff --git a/drivers/media/video/pxa_camera.c b/drivers/media/video/pxa_camera.c index 46e0d8ad880f..016bb45ba0c3 100644 --- a/drivers/media/video/pxa_camera.c +++ b/drivers/media/video/pxa_camera.c | |||
| @@ -612,6 +612,7 @@ static void pxa_camera_stop_capture(struct pxa_camera_dev *pcdev) | |||
| 612 | dev_dbg(pcdev->soc_host.dev, "%s\n", __func__); | 612 | dev_dbg(pcdev->soc_host.dev, "%s\n", __func__); |
| 613 | } | 613 | } |
| 614 | 614 | ||
| 615 | /* Called under spinlock_irqsave(&pcdev->lock, ...) */ | ||
| 615 | static void pxa_videobuf_queue(struct videobuf_queue *vq, | 616 | static void pxa_videobuf_queue(struct videobuf_queue *vq, |
| 616 | struct videobuf_buffer *vb) | 617 | struct videobuf_buffer *vb) |
| 617 | { | 618 | { |
| @@ -619,13 +620,10 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq, | |||
| 619 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 620 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
| 620 | struct pxa_camera_dev *pcdev = ici->priv; | 621 | struct pxa_camera_dev *pcdev = ici->priv; |
| 621 | struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb); | 622 | struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb); |
| 622 | unsigned long flags; | ||
| 623 | 623 | ||
| 624 | dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d active=%p\n", __func__, | 624 | dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d active=%p\n", __func__, |
| 625 | vb, vb->baddr, vb->bsize, pcdev->active); | 625 | vb, vb->baddr, vb->bsize, pcdev->active); |
| 626 | 626 | ||
| 627 | spin_lock_irqsave(&pcdev->lock, flags); | ||
| 628 | |||
| 629 | list_add_tail(&vb->queue, &pcdev->capture); | 627 | list_add_tail(&vb->queue, &pcdev->capture); |
| 630 | 628 | ||
| 631 | vb->state = VIDEOBUF_ACTIVE; | 629 | vb->state = VIDEOBUF_ACTIVE; |
| @@ -633,8 +631,6 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq, | |||
| 633 | 631 | ||
| 634 | if (!pcdev->active) | 632 | if (!pcdev->active) |
| 635 | pxa_camera_start_capture(pcdev); | 633 | pxa_camera_start_capture(pcdev); |
| 636 | |||
| 637 | spin_unlock_irqrestore(&pcdev->lock, flags); | ||
| 638 | } | 634 | } |
| 639 | 635 | ||
| 640 | static void pxa_videobuf_release(struct videobuf_queue *vq, | 636 | static void pxa_videobuf_release(struct videobuf_queue *vq, |
| @@ -1579,6 +1575,7 @@ static int __devinit pxa_camera_probe(struct platform_device *pdev) | |||
| 1579 | pcdev->mclk = 20000000; | 1575 | pcdev->mclk = 20000000; |
| 1580 | } | 1576 | } |
| 1581 | 1577 | ||
| 1578 | pcdev->soc_host.dev = &pdev->dev; | ||
| 1582 | pcdev->mclk_divisor = mclk_get_divisor(pcdev); | 1579 | pcdev->mclk_divisor = mclk_get_divisor(pcdev); |
| 1583 | 1580 | ||
| 1584 | INIT_LIST_HEAD(&pcdev->capture); | 1581 | INIT_LIST_HEAD(&pcdev->capture); |
| @@ -1644,7 +1641,6 @@ static int __devinit pxa_camera_probe(struct platform_device *pdev) | |||
| 1644 | pcdev->soc_host.drv_name = PXA_CAM_DRV_NAME; | 1641 | pcdev->soc_host.drv_name = PXA_CAM_DRV_NAME; |
| 1645 | pcdev->soc_host.ops = &pxa_soc_camera_host_ops; | 1642 | pcdev->soc_host.ops = &pxa_soc_camera_host_ops; |
| 1646 | pcdev->soc_host.priv = pcdev; | 1643 | pcdev->soc_host.priv = pcdev; |
| 1647 | pcdev->soc_host.dev = &pdev->dev; | ||
| 1648 | pcdev->soc_host.nr = pdev->id; | 1644 | pcdev->soc_host.nr = pdev->id; |
| 1649 | 1645 | ||
| 1650 | err = soc_camera_host_register(&pcdev->soc_host); | 1646 | err = soc_camera_host_register(&pcdev->soc_host); |
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index 06861b782b95..6eebe3ef97d3 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c | |||
| @@ -3331,8 +3331,8 @@ struct saa7134_board saa7134_boards[] = { | |||
| 3331 | .gpio = 0x0200100, | 3331 | .gpio = 0x0200100, |
| 3332 | }, | 3332 | }, |
| 3333 | }, | 3333 | }, |
| 3334 | [SAA7134_BOARD_HAUPPAUGE_HVR1120] = { | 3334 | [SAA7134_BOARD_HAUPPAUGE_HVR1150] = { |
| 3335 | .name = "Hauppauge WinTV-HVR1120 ATSC/QAM-Hybrid", | 3335 | .name = "Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid", |
| 3336 | .audio_clock = 0x00187de7, | 3336 | .audio_clock = 0x00187de7, |
| 3337 | .tuner_type = TUNER_PHILIPS_TDA8290, | 3337 | .tuner_type = TUNER_PHILIPS_TDA8290, |
| 3338 | .radio_type = UNSET, | 3338 | .radio_type = UNSET, |
| @@ -3363,8 +3363,8 @@ struct saa7134_board saa7134_boards[] = { | |||
| 3363 | .gpio = 0x0800100, /* GPIO 23 HI for FM */ | 3363 | .gpio = 0x0800100, /* GPIO 23 HI for FM */ |
| 3364 | }, | 3364 | }, |
| 3365 | }, | 3365 | }, |
| 3366 | [SAA7134_BOARD_HAUPPAUGE_HVR1110R3] = { | 3366 | [SAA7134_BOARD_HAUPPAUGE_HVR1120] = { |
| 3367 | .name = "Hauppauge WinTV-HVR1110r3 DVB-T/Hybrid", | 3367 | .name = "Hauppauge WinTV-HVR1120 DVB-T/Hybrid", |
| 3368 | .audio_clock = 0x00187de7, | 3368 | .audio_clock = 0x00187de7, |
| 3369 | .tuner_type = TUNER_PHILIPS_TDA8290, | 3369 | .tuner_type = TUNER_PHILIPS_TDA8290, |
| 3370 | .radio_type = UNSET, | 3370 | .radio_type = UNSET, |
| @@ -5862,31 +5862,31 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
| 5862 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 5862 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
| 5863 | .subvendor = 0x0070, | 5863 | .subvendor = 0x0070, |
| 5864 | .subdevice = 0x6706, | 5864 | .subdevice = 0x6706, |
| 5865 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120, | 5865 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1150, |
| 5866 | },{ | 5866 | },{ |
| 5867 | .vendor = PCI_VENDOR_ID_PHILIPS, | 5867 | .vendor = PCI_VENDOR_ID_PHILIPS, |
| 5868 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 5868 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
| 5869 | .subvendor = 0x0070, | 5869 | .subvendor = 0x0070, |
| 5870 | .subdevice = 0x6707, | 5870 | .subdevice = 0x6707, |
| 5871 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110R3, | 5871 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120, |
| 5872 | },{ | 5872 | },{ |
| 5873 | .vendor = PCI_VENDOR_ID_PHILIPS, | 5873 | .vendor = PCI_VENDOR_ID_PHILIPS, |
| 5874 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 5874 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
| 5875 | .subvendor = 0x0070, | 5875 | .subvendor = 0x0070, |
| 5876 | .subdevice = 0x6708, | 5876 | .subdevice = 0x6708, |
| 5877 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120, | 5877 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1150, |
| 5878 | },{ | 5878 | },{ |
| 5879 | .vendor = PCI_VENDOR_ID_PHILIPS, | 5879 | .vendor = PCI_VENDOR_ID_PHILIPS, |
| 5880 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 5880 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
| 5881 | .subvendor = 0x0070, | 5881 | .subvendor = 0x0070, |
| 5882 | .subdevice = 0x6709, | 5882 | .subdevice = 0x6709, |
| 5883 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110R3, | 5883 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120, |
| 5884 | },{ | 5884 | },{ |
| 5885 | .vendor = PCI_VENDOR_ID_PHILIPS, | 5885 | .vendor = PCI_VENDOR_ID_PHILIPS, |
| 5886 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 5886 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
| 5887 | .subvendor = 0x0070, | 5887 | .subvendor = 0x0070, |
| 5888 | .subdevice = 0x670a, | 5888 | .subdevice = 0x670a, |
| 5889 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110R3, | 5889 | .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120, |
| 5890 | },{ | 5890 | },{ |
| 5891 | .vendor = PCI_VENDOR_ID_PHILIPS, | 5891 | .vendor = PCI_VENDOR_ID_PHILIPS, |
| 5892 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 5892 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
| @@ -6363,8 +6363,8 @@ static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev, | |||
| 6363 | switch (command) { | 6363 | switch (command) { |
| 6364 | case TDA18271_CALLBACK_CMD_AGC_ENABLE: /* 0 */ | 6364 | case TDA18271_CALLBACK_CMD_AGC_ENABLE: /* 0 */ |
| 6365 | switch (dev->board) { | 6365 | switch (dev->board) { |
| 6366 | case SAA7134_BOARD_HAUPPAUGE_HVR1150: | ||
| 6366 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: | 6367 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: |
| 6367 | case SAA7134_BOARD_HAUPPAUGE_HVR1110R3: | ||
| 6368 | ret = saa7134_tda18271_hvr11x0_toggle_agc(dev, arg); | 6368 | ret = saa7134_tda18271_hvr11x0_toggle_agc(dev, arg); |
| 6369 | break; | 6369 | break; |
| 6370 | default: | 6370 | default: |
| @@ -6384,8 +6384,8 @@ static int saa7134_tda8290_callback(struct saa7134_dev *dev, | |||
| 6384 | int ret; | 6384 | int ret; |
| 6385 | 6385 | ||
| 6386 | switch (dev->board) { | 6386 | switch (dev->board) { |
| 6387 | case SAA7134_BOARD_HAUPPAUGE_HVR1150: | ||
| 6387 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: | 6388 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: |
| 6388 | case SAA7134_BOARD_HAUPPAUGE_HVR1110R3: | ||
| 6389 | /* tda8290 + tda18271 */ | 6389 | /* tda8290 + tda18271 */ |
| 6390 | ret = saa7134_tda8290_18271_callback(dev, command, arg); | 6390 | ret = saa7134_tda8290_18271_callback(dev, command, arg); |
| 6391 | break; | 6391 | break; |
| @@ -6427,7 +6427,7 @@ static void hauppauge_eeprom(struct saa7134_dev *dev, u8 *eeprom_data) | |||
| 6427 | switch (tv.model) { | 6427 | switch (tv.model) { |
| 6428 | case 67019: /* WinTV-HVR1110 (Retail, IR Blaster, hybrid, FM, SVid/Comp, 3.5mm audio in) */ | 6428 | case 67019: /* WinTV-HVR1110 (Retail, IR Blaster, hybrid, FM, SVid/Comp, 3.5mm audio in) */ |
| 6429 | case 67109: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */ | 6429 | case 67109: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */ |
| 6430 | case 67201: /* WinTV-HVR1120 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */ | 6430 | case 67201: /* WinTV-HVR1150 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */ |
| 6431 | case 67301: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */ | 6431 | case 67301: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */ |
| 6432 | case 67209: /* WinTV-HVR1110 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */ | 6432 | case 67209: /* WinTV-HVR1110 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */ |
| 6433 | case 67559: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */ | 6433 | case 67559: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */ |
| @@ -6435,7 +6435,7 @@ static void hauppauge_eeprom(struct saa7134_dev *dev, u8 *eeprom_data) | |||
| 6435 | case 67579: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM) */ | 6435 | case 67579: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM) */ |
| 6436 | case 67589: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */ | 6436 | case 67589: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */ |
| 6437 | case 67599: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */ | 6437 | case 67599: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */ |
| 6438 | case 67651: /* WinTV-HVR1120 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */ | 6438 | case 67651: /* WinTV-HVR1150 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */ |
| 6439 | case 67659: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */ | 6439 | case 67659: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */ |
| 6440 | break; | 6440 | break; |
| 6441 | default: | 6441 | default: |
| @@ -6625,8 +6625,8 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
| 6625 | 6625 | ||
| 6626 | saa_writeb (SAA7134_PRODUCTION_TEST_MODE, 0x00); | 6626 | saa_writeb (SAA7134_PRODUCTION_TEST_MODE, 0x00); |
| 6627 | break; | 6627 | break; |
| 6628 | case SAA7134_BOARD_HAUPPAUGE_HVR1150: | ||
| 6628 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: | 6629 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: |
| 6629 | case SAA7134_BOARD_HAUPPAUGE_HVR1110R3: | ||
| 6630 | /* GPIO 26 high for digital, low for analog */ | 6630 | /* GPIO 26 high for digital, low for analog */ |
| 6631 | saa7134_set_gpio(dev, 26, 0); | 6631 | saa7134_set_gpio(dev, 26, 0); |
| 6632 | msleep(1); | 6632 | msleep(1); |
| @@ -6891,8 +6891,8 @@ int saa7134_board_init2(struct saa7134_dev *dev) | |||
| 6891 | dev->name, saa7134_boards[dev->board].name); | 6891 | dev->name, saa7134_boards[dev->board].name); |
| 6892 | } | 6892 | } |
| 6893 | break; | 6893 | break; |
| 6894 | case SAA7134_BOARD_HAUPPAUGE_HVR1150: | ||
| 6894 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: | 6895 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: |
| 6895 | case SAA7134_BOARD_HAUPPAUGE_HVR1110R3: | ||
| 6896 | hauppauge_eeprom(dev, dev->eedata+0x80); | 6896 | hauppauge_eeprom(dev, dev->eedata+0x80); |
| 6897 | break; | 6897 | break; |
| 6898 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: | 6898 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 31930f26ffc7..98f3efd1e944 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
| @@ -1119,7 +1119,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1119 | &tda827x_cfg_2) < 0) | 1119 | &tda827x_cfg_2) < 0) |
| 1120 | goto dettach_frontend; | 1120 | goto dettach_frontend; |
| 1121 | break; | 1121 | break; |
| 1122 | case SAA7134_BOARD_HAUPPAUGE_HVR1110R3: | 1122 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: |
| 1123 | fe0->dvb.frontend = dvb_attach(tda10048_attach, | 1123 | fe0->dvb.frontend = dvb_attach(tda10048_attach, |
| 1124 | &hcw_tda10048_config, | 1124 | &hcw_tda10048_config, |
| 1125 | &dev->i2c_adap); | 1125 | &dev->i2c_adap); |
| @@ -1147,7 +1147,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1147 | &tda827x_cfg_1) < 0) | 1147 | &tda827x_cfg_1) < 0) |
| 1148 | goto dettach_frontend; | 1148 | goto dettach_frontend; |
| 1149 | break; | 1149 | break; |
| 1150 | case SAA7134_BOARD_HAUPPAUGE_HVR1120: | 1150 | case SAA7134_BOARD_HAUPPAUGE_HVR1150: |
| 1151 | fe0->dvb.frontend = dvb_attach(lgdt3305_attach, | 1151 | fe0->dvb.frontend = dvb_attach(lgdt3305_attach, |
| 1152 | &hcw_lgdt3305_config, | 1152 | &hcw_lgdt3305_config, |
| 1153 | &dev->i2c_adap); | 1153 | &dev->i2c_adap); |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index 82268848f26a..fb564f14887c 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
| @@ -278,8 +278,8 @@ struct saa7134_format { | |||
| 278 | #define SAA7134_BOARD_ASUSTeK_TIGER 152 | 278 | #define SAA7134_BOARD_ASUSTeK_TIGER 152 |
| 279 | #define SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG 153 | 279 | #define SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG 153 |
| 280 | #define SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS 154 | 280 | #define SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS 154 |
| 281 | #define SAA7134_BOARD_HAUPPAUGE_HVR1120 155 | 281 | #define SAA7134_BOARD_HAUPPAUGE_HVR1150 155 |
| 282 | #define SAA7134_BOARD_HAUPPAUGE_HVR1110R3 156 | 282 | #define SAA7134_BOARD_HAUPPAUGE_HVR1120 156 |
| 283 | #define SAA7134_BOARD_AVERMEDIA_STUDIO_507UA 157 | 283 | #define SAA7134_BOARD_AVERMEDIA_STUDIO_507UA 157 |
| 284 | #define SAA7134_BOARD_AVERMEDIA_CARDBUS_501 158 | 284 | #define SAA7134_BOARD_AVERMEDIA_CARDBUS_501 158 |
| 285 | #define SAA7134_BOARD_BEHOLD_505RDS 159 | 285 | #define SAA7134_BOARD_BEHOLD_505RDS 159 |
diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c index 0db88a53d92c..e86878deea71 100644 --- a/drivers/media/video/sh_mobile_ceu_camera.c +++ b/drivers/media/video/sh_mobile_ceu_camera.c | |||
| @@ -282,27 +282,24 @@ out: | |||
| 282 | return ret; | 282 | return ret; |
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | /* Called under spinlock_irqsave(&pcdev->lock, ...) */ | ||
| 285 | static void sh_mobile_ceu_videobuf_queue(struct videobuf_queue *vq, | 286 | static void sh_mobile_ceu_videobuf_queue(struct videobuf_queue *vq, |
| 286 | struct videobuf_buffer *vb) | 287 | struct videobuf_buffer *vb) |
| 287 | { | 288 | { |
| 288 | struct soc_camera_device *icd = vq->priv_data; | 289 | struct soc_camera_device *icd = vq->priv_data; |
| 289 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 290 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
| 290 | struct sh_mobile_ceu_dev *pcdev = ici->priv; | 291 | struct sh_mobile_ceu_dev *pcdev = ici->priv; |
| 291 | unsigned long flags; | ||
| 292 | 292 | ||
| 293 | dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__, | 293 | dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__, |
| 294 | vb, vb->baddr, vb->bsize); | 294 | vb, vb->baddr, vb->bsize); |
| 295 | 295 | ||
| 296 | vb->state = VIDEOBUF_QUEUED; | 296 | vb->state = VIDEOBUF_QUEUED; |
| 297 | spin_lock_irqsave(&pcdev->lock, flags); | ||
| 298 | list_add_tail(&vb->queue, &pcdev->capture); | 297 | list_add_tail(&vb->queue, &pcdev->capture); |
| 299 | 298 | ||
| 300 | if (!pcdev->active) { | 299 | if (!pcdev->active) { |
| 301 | pcdev->active = vb; | 300 | pcdev->active = vb; |
| 302 | sh_mobile_ceu_capture(pcdev); | 301 | sh_mobile_ceu_capture(pcdev); |
| 303 | } | 302 | } |
| 304 | |||
| 305 | spin_unlock_irqrestore(&pcdev->lock, flags); | ||
| 306 | } | 303 | } |
| 307 | 304 | ||
| 308 | static void sh_mobile_ceu_videobuf_release(struct videobuf_queue *vq, | 305 | static void sh_mobile_ceu_videobuf_release(struct videobuf_queue *vq, |
diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c index 4d6785e63455..b154bd961e3b 100644 --- a/drivers/media/video/stk-webcam.c +++ b/drivers/media/video/stk-webcam.c | |||
| @@ -1050,8 +1050,8 @@ static int stk_setup_format(struct stk_camera *dev) | |||
| 1050 | depth = 1; | 1050 | depth = 1; |
| 1051 | else | 1051 | else |
| 1052 | depth = 2; | 1052 | depth = 2; |
| 1053 | while (stk_sizes[i].m != dev->vsettings.mode | 1053 | while (i < ARRAY_SIZE(stk_sizes) && |
| 1054 | && i < ARRAY_SIZE(stk_sizes)) | 1054 | stk_sizes[i].m != dev->vsettings.mode) |
| 1055 | i++; | 1055 | i++; |
| 1056 | if (i == ARRAY_SIZE(stk_sizes)) { | 1056 | if (i == ARRAY_SIZE(stk_sizes)) { |
| 1057 | STK_ERROR("Something is broken in %s\n", __func__); | 1057 | STK_ERROR("Something is broken in %s\n", __func__); |
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c index 89927b7aec28..04b47832fa0a 100644 --- a/drivers/media/video/uvc/uvc_driver.c +++ b/drivers/media/video/uvc/uvc_driver.c | |||
| @@ -1845,11 +1845,29 @@ static struct usb_device_id uvc_ids[] = { | |||
| 1845 | .bInterfaceSubClass = 1, | 1845 | .bInterfaceSubClass = 1, |
| 1846 | .bInterfaceProtocol = 0, | 1846 | .bInterfaceProtocol = 0, |
| 1847 | .driver_info = UVC_QUIRK_STREAM_NO_FID }, | 1847 | .driver_info = UVC_QUIRK_STREAM_NO_FID }, |
| 1848 | /* ViMicro */ | 1848 | /* ViMicro Vega */ |
| 1849 | { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 1849 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
| 1850 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1851 | .idVendor = 0x0ac8, | ||
| 1852 | .idProduct = 0x332d, | ||
| 1853 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1854 | .bInterfaceSubClass = 1, | ||
| 1855 | .bInterfaceProtocol = 0, | ||
| 1856 | .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, | ||
| 1857 | /* ViMicro - Minoru3D */ | ||
| 1858 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1859 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1860 | .idVendor = 0x0ac8, | ||
| 1861 | .idProduct = 0x3410, | ||
| 1862 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1863 | .bInterfaceSubClass = 1, | ||
| 1864 | .bInterfaceProtocol = 0, | ||
| 1865 | .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, | ||
| 1866 | /* ViMicro Venus - Minoru3D */ | ||
| 1867 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1850 | | USB_DEVICE_ID_MATCH_INT_INFO, | 1868 | | USB_DEVICE_ID_MATCH_INT_INFO, |
| 1851 | .idVendor = 0x0ac8, | 1869 | .idVendor = 0x0ac8, |
| 1852 | .idProduct = 0x0000, | 1870 | .idProduct = 0x3420, |
| 1853 | .bInterfaceClass = USB_CLASS_VIDEO, | 1871 | .bInterfaceClass = USB_CLASS_VIDEO, |
| 1854 | .bInterfaceSubClass = 1, | 1872 | .bInterfaceSubClass = 1, |
| 1855 | .bInterfaceProtocol = 0, | 1873 | .bInterfaceProtocol = 0, |
diff --git a/drivers/media/video/uvc/uvc_status.c b/drivers/media/video/uvc/uvc_status.c index f152a9903862..1ca6dff73612 100644 --- a/drivers/media/video/uvc/uvc_status.c +++ b/drivers/media/video/uvc/uvc_status.c | |||
| @@ -145,8 +145,8 @@ static void uvc_status_complete(struct urb *urb) | |||
| 145 | break; | 145 | break; |
| 146 | 146 | ||
| 147 | default: | 147 | default: |
| 148 | uvc_printk(KERN_INFO, "unknown event type %u.\n", | 148 | uvc_trace(UVC_TRACE_STATUS, "Unknown status event " |
| 149 | dev->status[0]); | 149 | "type %u.\n", dev->status[0]); |
| 150 | break; | 150 | break; |
| 151 | } | 151 | } |
| 152 | } | 152 | } |
diff --git a/drivers/media/video/v4l2-ioctl.c b/drivers/media/video/v4l2-ioctl.c index be64a502ea27..f2afc4e08379 100644 --- a/drivers/media/video/v4l2-ioctl.c +++ b/drivers/media/video/v4l2-ioctl.c | |||
| @@ -1081,8 +1081,10 @@ static long __video_do_ioctl(struct file *file, | |||
| 1081 | /* Calls the specific handler */ | 1081 | /* Calls the specific handler */ |
| 1082 | if (ops->vidioc_g_std) | 1082 | if (ops->vidioc_g_std) |
| 1083 | ret = ops->vidioc_g_std(file, fh, id); | 1083 | ret = ops->vidioc_g_std(file, fh, id); |
| 1084 | else | 1084 | else if (vfd->current_norm) |
| 1085 | *id = vfd->current_norm; | 1085 | *id = vfd->current_norm; |
| 1086 | else | ||
| 1087 | ret = -EINVAL; | ||
| 1086 | 1088 | ||
| 1087 | if (!ret) | 1089 | if (!ret) |
| 1088 | dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id); | 1090 | dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id); |
| @@ -1553,12 +1555,19 @@ static long __video_do_ioctl(struct file *file, | |||
| 1553 | break; | 1555 | break; |
| 1554 | ret = ops->vidioc_g_parm(file, fh, p); | 1556 | ret = ops->vidioc_g_parm(file, fh, p); |
| 1555 | } else { | 1557 | } else { |
| 1558 | v4l2_std_id std = vfd->current_norm; | ||
| 1559 | |||
| 1556 | if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | 1560 | if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) |
| 1557 | return -EINVAL; | 1561 | return -EINVAL; |
| 1558 | 1562 | ||
| 1559 | v4l2_video_std_frame_period(vfd->current_norm, | ||
| 1560 | &p->parm.capture.timeperframe); | ||
| 1561 | ret = 0; | 1563 | ret = 0; |
| 1564 | if (ops->vidioc_g_std) | ||
| 1565 | ret = ops->vidioc_g_std(file, fh, &std); | ||
| 1566 | else if (std == 0) | ||
| 1567 | ret = -EINVAL; | ||
| 1568 | if (ret == 0) | ||
| 1569 | v4l2_video_std_frame_period(std, | ||
| 1570 | &p->parm.capture.timeperframe); | ||
| 1562 | } | 1571 | } |
| 1563 | 1572 | ||
| 1564 | dbgarg(cmd, "type=%d\n", p->type); | 1573 | dbgarg(cmd, "type=%d\n", p->type); |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index c20416850948..45675889850b 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -235,6 +235,7 @@ enum vortex_chips { | |||
| 235 | CH_3C900B_FL, | 235 | CH_3C900B_FL, |
| 236 | CH_3C905_1, | 236 | CH_3C905_1, |
| 237 | CH_3C905_2, | 237 | CH_3C905_2, |
| 238 | CH_3C905B_TX, | ||
| 238 | CH_3C905B_1, | 239 | CH_3C905B_1, |
| 239 | 240 | ||
| 240 | CH_3C905B_2, | 241 | CH_3C905B_2, |
| @@ -307,6 +308,8 @@ static struct vortex_chip_info { | |||
| 307 | PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, | 308 | PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, |
| 308 | {"3c905 Boomerang 100baseT4", | 309 | {"3c905 Boomerang 100baseT4", |
| 309 | PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, | 310 | PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, |
| 311 | {"3C905B-TX Fast Etherlink XL PCI", | ||
| 312 | PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, | ||
| 310 | {"3c905B Cyclone 100baseTx", | 313 | {"3c905B Cyclone 100baseTx", |
| 311 | PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, | 314 | PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, |
| 312 | 315 | ||
| @@ -389,6 +392,7 @@ static struct pci_device_id vortex_pci_tbl[] = { | |||
| 389 | { 0x10B7, 0x900A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900B_FL }, | 392 | { 0x10B7, 0x900A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900B_FL }, |
| 390 | { 0x10B7, 0x9050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_1 }, | 393 | { 0x10B7, 0x9050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_1 }, |
| 391 | { 0x10B7, 0x9051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_2 }, | 394 | { 0x10B7, 0x9051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_2 }, |
| 395 | { 0x10B7, 0x9054, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_TX }, | ||
| 392 | { 0x10B7, 0x9055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_1 }, | 396 | { 0x10B7, 0x9055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_1 }, |
| 393 | 397 | ||
| 394 | { 0x10B7, 0x9058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_2 }, | 398 | { 0x10B7, 0x9058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_2 }, |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 50efde11ea6c..d0dbbf39349a 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
| @@ -515,7 +515,7 @@ rx_status_loop: | |||
| 515 | dma_addr_t mapping; | 515 | dma_addr_t mapping; |
| 516 | struct sk_buff *skb, *new_skb; | 516 | struct sk_buff *skb, *new_skb; |
| 517 | struct cp_desc *desc; | 517 | struct cp_desc *desc; |
| 518 | unsigned buflen; | 518 | const unsigned buflen = cp->rx_buf_sz; |
| 519 | 519 | ||
| 520 | skb = cp->rx_skb[rx_tail]; | 520 | skb = cp->rx_skb[rx_tail]; |
| 521 | BUG_ON(!skb); | 521 | BUG_ON(!skb); |
| @@ -549,8 +549,7 @@ rx_status_loop: | |||
| 549 | pr_debug("%s: rx slot %d status 0x%x len %d\n", | 549 | pr_debug("%s: rx slot %d status 0x%x len %d\n", |
| 550 | dev->name, rx_tail, status, len); | 550 | dev->name, rx_tail, status, len); |
| 551 | 551 | ||
| 552 | buflen = cp->rx_buf_sz + NET_IP_ALIGN; | 552 | new_skb = netdev_alloc_skb(dev, buflen + NET_IP_ALIGN); |
| 553 | new_skb = netdev_alloc_skb(dev, buflen); | ||
| 554 | if (!new_skb) { | 553 | if (!new_skb) { |
| 555 | dev->stats.rx_dropped++; | 554 | dev->stats.rx_dropped++; |
| 556 | goto rx_next; | 555 | goto rx_next; |
diff --git a/drivers/net/atl1c/atl1c_ethtool.c b/drivers/net/atl1c/atl1c_ethtool.c index 607007d75b6f..00d11b480af3 100644 --- a/drivers/net/atl1c/atl1c_ethtool.c +++ b/drivers/net/atl1c/atl1c_ethtool.c | |||
| @@ -232,11 +232,11 @@ static void atl1c_get_drvinfo(struct net_device *netdev, | |||
| 232 | { | 232 | { |
| 233 | struct atl1c_adapter *adapter = netdev_priv(netdev); | 233 | struct atl1c_adapter *adapter = netdev_priv(netdev); |
| 234 | 234 | ||
| 235 | strncpy(drvinfo->driver, atl1c_driver_name, sizeof(drvinfo->driver)); | 235 | strlcpy(drvinfo->driver, atl1c_driver_name, sizeof(drvinfo->driver)); |
| 236 | strncpy(drvinfo->version, atl1c_driver_version, | 236 | strlcpy(drvinfo->version, atl1c_driver_version, |
| 237 | sizeof(drvinfo->version)); | 237 | sizeof(drvinfo->version)); |
| 238 | strncpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version)); | 238 | strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version)); |
| 239 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), | 239 | strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), |
| 240 | sizeof(drvinfo->bus_info)); | 240 | sizeof(drvinfo->bus_info)); |
| 241 | drvinfo->n_stats = 0; | 241 | drvinfo->n_stats = 0; |
| 242 | drvinfo->testinfo_len = 0; | 242 | drvinfo->testinfo_len = 0; |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 94d7325caf4f..8bca12f71390 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
| @@ -3378,11 +3378,11 @@ static void atl1_get_drvinfo(struct net_device *netdev, | |||
| 3378 | { | 3378 | { |
| 3379 | struct atl1_adapter *adapter = netdev_priv(netdev); | 3379 | struct atl1_adapter *adapter = netdev_priv(netdev); |
| 3380 | 3380 | ||
| 3381 | strncpy(drvinfo->driver, ATLX_DRIVER_NAME, sizeof(drvinfo->driver)); | 3381 | strlcpy(drvinfo->driver, ATLX_DRIVER_NAME, sizeof(drvinfo->driver)); |
| 3382 | strncpy(drvinfo->version, ATLX_DRIVER_VERSION, | 3382 | strlcpy(drvinfo->version, ATLX_DRIVER_VERSION, |
| 3383 | sizeof(drvinfo->version)); | 3383 | sizeof(drvinfo->version)); |
| 3384 | strncpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version)); | 3384 | strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version)); |
| 3385 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), | 3385 | strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), |
| 3386 | sizeof(drvinfo->bus_info)); | 3386 | sizeof(drvinfo->bus_info)); |
| 3387 | drvinfo->eedump_len = ATL1_EEDUMP_LEN; | 3387 | drvinfo->eedump_len = ATL1_EEDUMP_LEN; |
| 3388 | } | 3388 | } |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 36d4d377ec2f..bafca672ea7d 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
| @@ -952,9 +952,10 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 952 | int rc = NETDEV_TX_OK; | 952 | int rc = NETDEV_TX_OK; |
| 953 | dma_addr_t mapping; | 953 | dma_addr_t mapping; |
| 954 | u32 len, entry, ctrl; | 954 | u32 len, entry, ctrl; |
| 955 | unsigned long flags; | ||
| 955 | 956 | ||
| 956 | len = skb->len; | 957 | len = skb->len; |
| 957 | spin_lock_irq(&bp->lock); | 958 | spin_lock_irqsave(&bp->lock, flags); |
| 958 | 959 | ||
| 959 | /* This is a hard error, log it. */ | 960 | /* This is a hard error, log it. */ |
| 960 | if (unlikely(TX_BUFFS_AVAIL(bp) < 1)) { | 961 | if (unlikely(TX_BUFFS_AVAIL(bp) < 1)) { |
| @@ -1027,7 +1028,7 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1027 | dev->trans_start = jiffies; | 1028 | dev->trans_start = jiffies; |
| 1028 | 1029 | ||
| 1029 | out_unlock: | 1030 | out_unlock: |
| 1030 | spin_unlock_irq(&bp->lock); | 1031 | spin_unlock_irqrestore(&bp->lock, flags); |
| 1031 | 1032 | ||
| 1032 | return rc; | 1033 | return rc; |
| 1033 | 1034 | ||
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index b70cc99962fc..06b901152d44 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -399,9 +399,11 @@ static int bnx2_unregister_cnic(struct net_device *dev) | |||
| 399 | struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; | 399 | struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; |
| 400 | struct cnic_eth_dev *cp = &bp->cnic_eth_dev; | 400 | struct cnic_eth_dev *cp = &bp->cnic_eth_dev; |
| 401 | 401 | ||
| 402 | mutex_lock(&bp->cnic_lock); | ||
| 402 | cp->drv_state = 0; | 403 | cp->drv_state = 0; |
| 403 | bnapi->cnic_present = 0; | 404 | bnapi->cnic_present = 0; |
| 404 | rcu_assign_pointer(bp->cnic_ops, NULL); | 405 | rcu_assign_pointer(bp->cnic_ops, NULL); |
| 406 | mutex_unlock(&bp->cnic_lock); | ||
| 405 | synchronize_rcu(); | 407 | synchronize_rcu(); |
| 406 | return 0; | 408 | return 0; |
| 407 | } | 409 | } |
| @@ -429,13 +431,13 @@ bnx2_cnic_stop(struct bnx2 *bp) | |||
| 429 | struct cnic_ops *c_ops; | 431 | struct cnic_ops *c_ops; |
| 430 | struct cnic_ctl_info info; | 432 | struct cnic_ctl_info info; |
| 431 | 433 | ||
| 432 | rcu_read_lock(); | 434 | mutex_lock(&bp->cnic_lock); |
| 433 | c_ops = rcu_dereference(bp->cnic_ops); | 435 | c_ops = bp->cnic_ops; |
| 434 | if (c_ops) { | 436 | if (c_ops) { |
| 435 | info.cmd = CNIC_CTL_STOP_CMD; | 437 | info.cmd = CNIC_CTL_STOP_CMD; |
| 436 | c_ops->cnic_ctl(bp->cnic_data, &info); | 438 | c_ops->cnic_ctl(bp->cnic_data, &info); |
| 437 | } | 439 | } |
| 438 | rcu_read_unlock(); | 440 | mutex_unlock(&bp->cnic_lock); |
| 439 | } | 441 | } |
| 440 | 442 | ||
| 441 | static void | 443 | static void |
| @@ -444,8 +446,8 @@ bnx2_cnic_start(struct bnx2 *bp) | |||
| 444 | struct cnic_ops *c_ops; | 446 | struct cnic_ops *c_ops; |
| 445 | struct cnic_ctl_info info; | 447 | struct cnic_ctl_info info; |
| 446 | 448 | ||
| 447 | rcu_read_lock(); | 449 | mutex_lock(&bp->cnic_lock); |
| 448 | c_ops = rcu_dereference(bp->cnic_ops); | 450 | c_ops = bp->cnic_ops; |
| 449 | if (c_ops) { | 451 | if (c_ops) { |
| 450 | if (!(bp->flags & BNX2_FLAG_USING_MSIX)) { | 452 | if (!(bp->flags & BNX2_FLAG_USING_MSIX)) { |
| 451 | struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; | 453 | struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; |
| @@ -455,7 +457,7 @@ bnx2_cnic_start(struct bnx2 *bp) | |||
| 455 | info.cmd = CNIC_CTL_START_CMD; | 457 | info.cmd = CNIC_CTL_START_CMD; |
| 456 | c_ops->cnic_ctl(bp->cnic_data, &info); | 458 | c_ops->cnic_ctl(bp->cnic_data, &info); |
| 457 | } | 459 | } |
| 458 | rcu_read_unlock(); | 460 | mutex_unlock(&bp->cnic_lock); |
| 459 | } | 461 | } |
| 460 | 462 | ||
| 461 | #else | 463 | #else |
| @@ -7663,6 +7665,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
| 7663 | 7665 | ||
| 7664 | spin_lock_init(&bp->phy_lock); | 7666 | spin_lock_init(&bp->phy_lock); |
| 7665 | spin_lock_init(&bp->indirect_lock); | 7667 | spin_lock_init(&bp->indirect_lock); |
| 7668 | #ifdef BCM_CNIC | ||
| 7669 | mutex_init(&bp->cnic_lock); | ||
| 7670 | #endif | ||
| 7666 | INIT_WORK(&bp->reset_task, bnx2_reset_task); | 7671 | INIT_WORK(&bp->reset_task, bnx2_reset_task); |
| 7667 | 7672 | ||
| 7668 | dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); | 7673 | dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index f1edfaa9e56a..a4f12fd0ecd2 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
| @@ -6902,6 +6902,7 @@ struct bnx2 { | |||
| 6902 | u32 idle_chk_status_idx; | 6902 | u32 idle_chk_status_idx; |
| 6903 | 6903 | ||
| 6904 | #ifdef BCM_CNIC | 6904 | #ifdef BCM_CNIC |
| 6905 | struct mutex cnic_lock; | ||
| 6905 | struct cnic_eth_dev cnic_eth_dev; | 6906 | struct cnic_eth_dev cnic_eth_dev; |
| 6906 | #endif | 6907 | #endif |
| 6907 | 6908 | ||
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 9e4283aff828..e1a4f8214239 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -611,11 +611,18 @@ nla_put_failure: | |||
| 611 | return -EMSGSIZE; | 611 | return -EMSGSIZE; |
| 612 | } | 612 | } |
| 613 | 613 | ||
| 614 | static int can_newlink(struct net_device *dev, | ||
| 615 | struct nlattr *tb[], struct nlattr *data[]) | ||
| 616 | { | ||
| 617 | return -EOPNOTSUPP; | ||
| 618 | } | ||
| 619 | |||
| 614 | static struct rtnl_link_ops can_link_ops __read_mostly = { | 620 | static struct rtnl_link_ops can_link_ops __read_mostly = { |
| 615 | .kind = "can", | 621 | .kind = "can", |
| 616 | .maxtype = IFLA_CAN_MAX, | 622 | .maxtype = IFLA_CAN_MAX, |
| 617 | .policy = can_policy, | 623 | .policy = can_policy, |
| 618 | .setup = can_setup, | 624 | .setup = can_setup, |
| 625 | .newlink = can_newlink, | ||
| 619 | .changelink = can_changelink, | 626 | .changelink = can_changelink, |
| 620 | .fill_info = can_fill_info, | 627 | .fill_info = can_fill_info, |
| 621 | .fill_xstats = can_fill_xstats, | 628 | .fill_xstats = can_fill_xstats, |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 4869d77cbe91..74c342959b7b 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
| @@ -138,6 +138,16 @@ static struct cnic_dev *cnic_from_netdev(struct net_device *netdev) | |||
| 138 | return NULL; | 138 | return NULL; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | static inline void ulp_get(struct cnic_ulp_ops *ulp_ops) | ||
| 142 | { | ||
| 143 | atomic_inc(&ulp_ops->ref_count); | ||
| 144 | } | ||
| 145 | |||
| 146 | static inline void ulp_put(struct cnic_ulp_ops *ulp_ops) | ||
| 147 | { | ||
| 148 | atomic_dec(&ulp_ops->ref_count); | ||
| 149 | } | ||
| 150 | |||
| 141 | static void cnic_ctx_wr(struct cnic_dev *dev, u32 cid_addr, u32 off, u32 val) | 151 | static void cnic_ctx_wr(struct cnic_dev *dev, u32 cid_addr, u32 off, u32 val) |
| 142 | { | 152 | { |
| 143 | struct cnic_local *cp = dev->cnic_priv; | 153 | struct cnic_local *cp = dev->cnic_priv; |
| @@ -358,6 +368,7 @@ int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops) | |||
| 358 | } | 368 | } |
| 359 | read_unlock(&cnic_dev_lock); | 369 | read_unlock(&cnic_dev_lock); |
| 360 | 370 | ||
| 371 | atomic_set(&ulp_ops->ref_count, 0); | ||
| 361 | rcu_assign_pointer(cnic_ulp_tbl[ulp_type], ulp_ops); | 372 | rcu_assign_pointer(cnic_ulp_tbl[ulp_type], ulp_ops); |
| 362 | mutex_unlock(&cnic_lock); | 373 | mutex_unlock(&cnic_lock); |
| 363 | 374 | ||
| @@ -379,6 +390,8 @@ int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops) | |||
| 379 | int cnic_unregister_driver(int ulp_type) | 390 | int cnic_unregister_driver(int ulp_type) |
| 380 | { | 391 | { |
| 381 | struct cnic_dev *dev; | 392 | struct cnic_dev *dev; |
| 393 | struct cnic_ulp_ops *ulp_ops; | ||
| 394 | int i = 0; | ||
| 382 | 395 | ||
| 383 | if (ulp_type >= MAX_CNIC_ULP_TYPE) { | 396 | if (ulp_type >= MAX_CNIC_ULP_TYPE) { |
| 384 | printk(KERN_ERR PFX "cnic_unregister_driver: Bad type %d\n", | 397 | printk(KERN_ERR PFX "cnic_unregister_driver: Bad type %d\n", |
| @@ -386,7 +399,8 @@ int cnic_unregister_driver(int ulp_type) | |||
| 386 | return -EINVAL; | 399 | return -EINVAL; |
| 387 | } | 400 | } |
| 388 | mutex_lock(&cnic_lock); | 401 | mutex_lock(&cnic_lock); |
| 389 | if (!cnic_ulp_tbl[ulp_type]) { | 402 | ulp_ops = cnic_ulp_tbl[ulp_type]; |
| 403 | if (!ulp_ops) { | ||
| 390 | printk(KERN_ERR PFX "cnic_unregister_driver: Type %d has not " | 404 | printk(KERN_ERR PFX "cnic_unregister_driver: Type %d has not " |
| 391 | "been registered\n", ulp_type); | 405 | "been registered\n", ulp_type); |
| 392 | goto out_unlock; | 406 | goto out_unlock; |
| @@ -411,6 +425,14 @@ int cnic_unregister_driver(int ulp_type) | |||
| 411 | 425 | ||
| 412 | mutex_unlock(&cnic_lock); | 426 | mutex_unlock(&cnic_lock); |
| 413 | synchronize_rcu(); | 427 | synchronize_rcu(); |
| 428 | while ((atomic_read(&ulp_ops->ref_count) != 0) && (i < 20)) { | ||
| 429 | msleep(100); | ||
| 430 | i++; | ||
| 431 | } | ||
| 432 | |||
| 433 | if (atomic_read(&ulp_ops->ref_count) != 0) | ||
| 434 | printk(KERN_WARNING PFX "%s: Failed waiting for ref count to go" | ||
| 435 | " to zero.\n", dev->netdev->name); | ||
| 414 | return 0; | 436 | return 0; |
| 415 | 437 | ||
| 416 | out_unlock: | 438 | out_unlock: |
| @@ -466,6 +488,7 @@ EXPORT_SYMBOL(cnic_register_driver); | |||
| 466 | static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type) | 488 | static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type) |
| 467 | { | 489 | { |
| 468 | struct cnic_local *cp = dev->cnic_priv; | 490 | struct cnic_local *cp = dev->cnic_priv; |
| 491 | int i = 0; | ||
| 469 | 492 | ||
| 470 | if (ulp_type >= MAX_CNIC_ULP_TYPE) { | 493 | if (ulp_type >= MAX_CNIC_ULP_TYPE) { |
| 471 | printk(KERN_ERR PFX "cnic_unregister_device: Bad type %d\n", | 494 | printk(KERN_ERR PFX "cnic_unregister_device: Bad type %d\n", |
| @@ -486,6 +509,15 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type) | |||
| 486 | 509 | ||
| 487 | synchronize_rcu(); | 510 | synchronize_rcu(); |
| 488 | 511 | ||
| 512 | while (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type]) && | ||
| 513 | i < 20) { | ||
| 514 | msleep(100); | ||
| 515 | i++; | ||
| 516 | } | ||
| 517 | if (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type])) | ||
| 518 | printk(KERN_WARNING PFX "%s: Failed waiting for ULP up call" | ||
| 519 | " to complete.\n", dev->netdev->name); | ||
| 520 | |||
| 489 | return 0; | 521 | return 0; |
| 490 | } | 522 | } |
| 491 | EXPORT_SYMBOL(cnic_unregister_driver); | 523 | EXPORT_SYMBOL(cnic_unregister_driver); |
| @@ -1076,18 +1108,23 @@ static void cnic_ulp_stop(struct cnic_dev *dev) | |||
| 1076 | if (cp->cnic_uinfo) | 1108 | if (cp->cnic_uinfo) |
| 1077 | cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL); | 1109 | cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL); |
| 1078 | 1110 | ||
| 1079 | rcu_read_lock(); | ||
| 1080 | for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { | 1111 | for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { |
| 1081 | struct cnic_ulp_ops *ulp_ops; | 1112 | struct cnic_ulp_ops *ulp_ops; |
| 1082 | 1113 | ||
| 1083 | ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); | 1114 | mutex_lock(&cnic_lock); |
| 1084 | if (!ulp_ops) | 1115 | ulp_ops = cp->ulp_ops[if_type]; |
| 1116 | if (!ulp_ops) { | ||
| 1117 | mutex_unlock(&cnic_lock); | ||
| 1085 | continue; | 1118 | continue; |
| 1119 | } | ||
| 1120 | set_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]); | ||
| 1121 | mutex_unlock(&cnic_lock); | ||
| 1086 | 1122 | ||
| 1087 | if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type])) | 1123 | if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type])) |
| 1088 | ulp_ops->cnic_stop(cp->ulp_handle[if_type]); | 1124 | ulp_ops->cnic_stop(cp->ulp_handle[if_type]); |
| 1125 | |||
| 1126 | clear_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]); | ||
| 1089 | } | 1127 | } |
| 1090 | rcu_read_unlock(); | ||
| 1091 | } | 1128 | } |
| 1092 | 1129 | ||
| 1093 | static void cnic_ulp_start(struct cnic_dev *dev) | 1130 | static void cnic_ulp_start(struct cnic_dev *dev) |
| @@ -1095,18 +1132,23 @@ static void cnic_ulp_start(struct cnic_dev *dev) | |||
| 1095 | struct cnic_local *cp = dev->cnic_priv; | 1132 | struct cnic_local *cp = dev->cnic_priv; |
| 1096 | int if_type; | 1133 | int if_type; |
| 1097 | 1134 | ||
| 1098 | rcu_read_lock(); | ||
| 1099 | for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { | 1135 | for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { |
| 1100 | struct cnic_ulp_ops *ulp_ops; | 1136 | struct cnic_ulp_ops *ulp_ops; |
| 1101 | 1137 | ||
| 1102 | ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); | 1138 | mutex_lock(&cnic_lock); |
| 1103 | if (!ulp_ops || !ulp_ops->cnic_start) | 1139 | ulp_ops = cp->ulp_ops[if_type]; |
| 1140 | if (!ulp_ops || !ulp_ops->cnic_start) { | ||
| 1141 | mutex_unlock(&cnic_lock); | ||
| 1104 | continue; | 1142 | continue; |
| 1143 | } | ||
| 1144 | set_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]); | ||
| 1145 | mutex_unlock(&cnic_lock); | ||
| 1105 | 1146 | ||
| 1106 | if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[if_type])) | 1147 | if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[if_type])) |
| 1107 | ulp_ops->cnic_start(cp->ulp_handle[if_type]); | 1148 | ulp_ops->cnic_start(cp->ulp_handle[if_type]); |
| 1149 | |||
| 1150 | clear_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]); | ||
| 1108 | } | 1151 | } |
| 1109 | rcu_read_unlock(); | ||
| 1110 | } | 1152 | } |
| 1111 | 1153 | ||
| 1112 | static int cnic_ctl(void *data, struct cnic_ctl_info *info) | 1154 | static int cnic_ctl(void *data, struct cnic_ctl_info *info) |
| @@ -1116,22 +1158,18 @@ static int cnic_ctl(void *data, struct cnic_ctl_info *info) | |||
| 1116 | switch (info->cmd) { | 1158 | switch (info->cmd) { |
| 1117 | case CNIC_CTL_STOP_CMD: | 1159 | case CNIC_CTL_STOP_CMD: |
| 1118 | cnic_hold(dev); | 1160 | cnic_hold(dev); |
| 1119 | mutex_lock(&cnic_lock); | ||
| 1120 | 1161 | ||
| 1121 | cnic_ulp_stop(dev); | 1162 | cnic_ulp_stop(dev); |
| 1122 | cnic_stop_hw(dev); | 1163 | cnic_stop_hw(dev); |
| 1123 | 1164 | ||
| 1124 | mutex_unlock(&cnic_lock); | ||
| 1125 | cnic_put(dev); | 1165 | cnic_put(dev); |
| 1126 | break; | 1166 | break; |
| 1127 | case CNIC_CTL_START_CMD: | 1167 | case CNIC_CTL_START_CMD: |
| 1128 | cnic_hold(dev); | 1168 | cnic_hold(dev); |
| 1129 | mutex_lock(&cnic_lock); | ||
| 1130 | 1169 | ||
| 1131 | if (!cnic_start_hw(dev)) | 1170 | if (!cnic_start_hw(dev)) |
| 1132 | cnic_ulp_start(dev); | 1171 | cnic_ulp_start(dev); |
| 1133 | 1172 | ||
| 1134 | mutex_unlock(&cnic_lock); | ||
| 1135 | cnic_put(dev); | 1173 | cnic_put(dev); |
| 1136 | break; | 1174 | break; |
| 1137 | default: | 1175 | default: |
| @@ -1145,19 +1183,23 @@ static void cnic_ulp_init(struct cnic_dev *dev) | |||
| 1145 | int i; | 1183 | int i; |
| 1146 | struct cnic_local *cp = dev->cnic_priv; | 1184 | struct cnic_local *cp = dev->cnic_priv; |
| 1147 | 1185 | ||
| 1148 | rcu_read_lock(); | ||
| 1149 | for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { | 1186 | for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { |
| 1150 | struct cnic_ulp_ops *ulp_ops; | 1187 | struct cnic_ulp_ops *ulp_ops; |
| 1151 | 1188 | ||
| 1152 | ulp_ops = rcu_dereference(cnic_ulp_tbl[i]); | 1189 | mutex_lock(&cnic_lock); |
| 1153 | if (!ulp_ops || !ulp_ops->cnic_init) | 1190 | ulp_ops = cnic_ulp_tbl[i]; |
| 1191 | if (!ulp_ops || !ulp_ops->cnic_init) { | ||
| 1192 | mutex_unlock(&cnic_lock); | ||
| 1154 | continue; | 1193 | continue; |
| 1194 | } | ||
| 1195 | ulp_get(ulp_ops); | ||
| 1196 | mutex_unlock(&cnic_lock); | ||
| 1155 | 1197 | ||
| 1156 | if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[i])) | 1198 | if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[i])) |
| 1157 | ulp_ops->cnic_init(dev); | 1199 | ulp_ops->cnic_init(dev); |
| 1158 | 1200 | ||
| 1201 | ulp_put(ulp_ops); | ||
| 1159 | } | 1202 | } |
| 1160 | rcu_read_unlock(); | ||
| 1161 | } | 1203 | } |
| 1162 | 1204 | ||
| 1163 | static void cnic_ulp_exit(struct cnic_dev *dev) | 1205 | static void cnic_ulp_exit(struct cnic_dev *dev) |
| @@ -1165,19 +1207,23 @@ static void cnic_ulp_exit(struct cnic_dev *dev) | |||
| 1165 | int i; | 1207 | int i; |
| 1166 | struct cnic_local *cp = dev->cnic_priv; | 1208 | struct cnic_local *cp = dev->cnic_priv; |
| 1167 | 1209 | ||
| 1168 | rcu_read_lock(); | ||
| 1169 | for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { | 1210 | for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { |
| 1170 | struct cnic_ulp_ops *ulp_ops; | 1211 | struct cnic_ulp_ops *ulp_ops; |
| 1171 | 1212 | ||
| 1172 | ulp_ops = rcu_dereference(cnic_ulp_tbl[i]); | 1213 | mutex_lock(&cnic_lock); |
| 1173 | if (!ulp_ops || !ulp_ops->cnic_exit) | 1214 | ulp_ops = cnic_ulp_tbl[i]; |
| 1215 | if (!ulp_ops || !ulp_ops->cnic_exit) { | ||
| 1216 | mutex_unlock(&cnic_lock); | ||
| 1174 | continue; | 1217 | continue; |
| 1218 | } | ||
| 1219 | ulp_get(ulp_ops); | ||
| 1220 | mutex_unlock(&cnic_lock); | ||
| 1175 | 1221 | ||
| 1176 | if (test_and_clear_bit(ULP_F_INIT, &cp->ulp_flags[i])) | 1222 | if (test_and_clear_bit(ULP_F_INIT, &cp->ulp_flags[i])) |
| 1177 | ulp_ops->cnic_exit(dev); | 1223 | ulp_ops->cnic_exit(dev); |
| 1178 | 1224 | ||
| 1225 | ulp_put(ulp_ops); | ||
| 1179 | } | 1226 | } |
| 1180 | rcu_read_unlock(); | ||
| 1181 | } | 1227 | } |
| 1182 | 1228 | ||
| 1183 | static int cnic_cm_offload_pg(struct cnic_sock *csk) | 1229 | static int cnic_cm_offload_pg(struct cnic_sock *csk) |
| @@ -2393,21 +2439,45 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev) | |||
| 2393 | return 0; | 2439 | return 0; |
| 2394 | } | 2440 | } |
| 2395 | 2441 | ||
| 2396 | static int cnic_start_hw(struct cnic_dev *dev) | 2442 | static int cnic_register_netdev(struct cnic_dev *dev) |
| 2397 | { | 2443 | { |
| 2398 | struct cnic_local *cp = dev->cnic_priv; | 2444 | struct cnic_local *cp = dev->cnic_priv; |
| 2399 | struct cnic_eth_dev *ethdev = cp->ethdev; | 2445 | struct cnic_eth_dev *ethdev = cp->ethdev; |
| 2400 | int err; | 2446 | int err; |
| 2401 | 2447 | ||
| 2402 | if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) | 2448 | if (!ethdev) |
| 2403 | return -EALREADY; | 2449 | return -ENODEV; |
| 2450 | |||
| 2451 | if (ethdev->drv_state & CNIC_DRV_STATE_REGD) | ||
| 2452 | return 0; | ||
| 2404 | 2453 | ||
| 2405 | err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev); | 2454 | err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev); |
| 2406 | if (err) { | 2455 | if (err) |
| 2407 | printk(KERN_ERR PFX "%s: register_cnic failed\n", | 2456 | printk(KERN_ERR PFX "%s: register_cnic failed\n", |
| 2408 | dev->netdev->name); | 2457 | dev->netdev->name); |
| 2409 | goto err2; | 2458 | |
| 2410 | } | 2459 | return err; |
| 2460 | } | ||
| 2461 | |||
| 2462 | static void cnic_unregister_netdev(struct cnic_dev *dev) | ||
| 2463 | { | ||
| 2464 | struct cnic_local *cp = dev->cnic_priv; | ||
| 2465 | struct cnic_eth_dev *ethdev = cp->ethdev; | ||
| 2466 | |||
| 2467 | if (!ethdev) | ||
| 2468 | return; | ||
| 2469 | |||
| 2470 | ethdev->drv_unregister_cnic(dev->netdev); | ||
| 2471 | } | ||
| 2472 | |||
| 2473 | static int cnic_start_hw(struct cnic_dev *dev) | ||
| 2474 | { | ||
| 2475 | struct cnic_local *cp = dev->cnic_priv; | ||
| 2476 | struct cnic_eth_dev *ethdev = cp->ethdev; | ||
| 2477 | int err; | ||
| 2478 | |||
| 2479 | if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) | ||
| 2480 | return -EALREADY; | ||
| 2411 | 2481 | ||
| 2412 | dev->regview = ethdev->io_base; | 2482 | dev->regview = ethdev->io_base; |
| 2413 | cp->chip_id = ethdev->chip_id; | 2483 | cp->chip_id = ethdev->chip_id; |
| @@ -2438,18 +2508,13 @@ static int cnic_start_hw(struct cnic_dev *dev) | |||
| 2438 | return 0; | 2508 | return 0; |
| 2439 | 2509 | ||
| 2440 | err1: | 2510 | err1: |
| 2441 | ethdev->drv_unregister_cnic(dev->netdev); | ||
| 2442 | cp->free_resc(dev); | 2511 | cp->free_resc(dev); |
| 2443 | pci_dev_put(dev->pcidev); | 2512 | pci_dev_put(dev->pcidev); |
| 2444 | err2: | ||
| 2445 | return err; | 2513 | return err; |
| 2446 | } | 2514 | } |
| 2447 | 2515 | ||
| 2448 | static void cnic_stop_bnx2_hw(struct cnic_dev *dev) | 2516 | static void cnic_stop_bnx2_hw(struct cnic_dev *dev) |
| 2449 | { | 2517 | { |
| 2450 | struct cnic_local *cp = dev->cnic_priv; | ||
| 2451 | struct cnic_eth_dev *ethdev = cp->ethdev; | ||
| 2452 | |||
| 2453 | cnic_disable_bnx2_int_sync(dev); | 2518 | cnic_disable_bnx2_int_sync(dev); |
| 2454 | 2519 | ||
| 2455 | cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, 0); | 2520 | cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, 0); |
| @@ -2461,8 +2526,6 @@ static void cnic_stop_bnx2_hw(struct cnic_dev *dev) | |||
| 2461 | cnic_setup_5709_context(dev, 0); | 2526 | cnic_setup_5709_context(dev, 0); |
| 2462 | cnic_free_irq(dev); | 2527 | cnic_free_irq(dev); |
| 2463 | 2528 | ||
| 2464 | ethdev->drv_unregister_cnic(dev->netdev); | ||
| 2465 | |||
| 2466 | cnic_free_resc(dev); | 2529 | cnic_free_resc(dev); |
| 2467 | } | 2530 | } |
| 2468 | 2531 | ||
| @@ -2543,7 +2606,7 @@ static struct cnic_dev *init_bnx2_cnic(struct net_device *dev) | |||
| 2543 | probe = symbol_get(bnx2_cnic_probe); | 2606 | probe = symbol_get(bnx2_cnic_probe); |
| 2544 | if (probe) { | 2607 | if (probe) { |
| 2545 | ethdev = (*probe)(dev); | 2608 | ethdev = (*probe)(dev); |
| 2546 | symbol_put_addr(probe); | 2609 | symbol_put(bnx2_cnic_probe); |
| 2547 | } | 2610 | } |
| 2548 | if (!ethdev) | 2611 | if (!ethdev) |
| 2549 | return NULL; | 2612 | return NULL; |
| @@ -2646,10 +2709,12 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event, | |||
| 2646 | else if (event == NETDEV_UNREGISTER) | 2709 | else if (event == NETDEV_UNREGISTER) |
| 2647 | cnic_ulp_exit(dev); | 2710 | cnic_ulp_exit(dev); |
| 2648 | else if (event == NETDEV_UP) { | 2711 | else if (event == NETDEV_UP) { |
| 2649 | mutex_lock(&cnic_lock); | 2712 | if (cnic_register_netdev(dev) != 0) { |
| 2713 | cnic_put(dev); | ||
| 2714 | goto done; | ||
| 2715 | } | ||
| 2650 | if (!cnic_start_hw(dev)) | 2716 | if (!cnic_start_hw(dev)) |
| 2651 | cnic_ulp_start(dev); | 2717 | cnic_ulp_start(dev); |
| 2652 | mutex_unlock(&cnic_lock); | ||
| 2653 | } | 2718 | } |
| 2654 | 2719 | ||
| 2655 | rcu_read_lock(); | 2720 | rcu_read_lock(); |
| @@ -2668,10 +2733,9 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event, | |||
| 2668 | rcu_read_unlock(); | 2733 | rcu_read_unlock(); |
| 2669 | 2734 | ||
| 2670 | if (event == NETDEV_GOING_DOWN) { | 2735 | if (event == NETDEV_GOING_DOWN) { |
| 2671 | mutex_lock(&cnic_lock); | ||
| 2672 | cnic_ulp_stop(dev); | 2736 | cnic_ulp_stop(dev); |
| 2673 | cnic_stop_hw(dev); | 2737 | cnic_stop_hw(dev); |
| 2674 | mutex_unlock(&cnic_lock); | 2738 | cnic_unregister_netdev(dev); |
| 2675 | } else if (event == NETDEV_UNREGISTER) { | 2739 | } else if (event == NETDEV_UNREGISTER) { |
| 2676 | write_lock(&cnic_dev_lock); | 2740 | write_lock(&cnic_dev_lock); |
| 2677 | list_del_init(&dev->list); | 2741 | list_del_init(&dev->list); |
| @@ -2703,6 +2767,7 @@ static void cnic_release(void) | |||
| 2703 | } | 2767 | } |
| 2704 | 2768 | ||
| 2705 | cnic_ulp_exit(dev); | 2769 | cnic_ulp_exit(dev); |
| 2770 | cnic_unregister_netdev(dev); | ||
| 2706 | list_del_init(&dev->list); | 2771 | list_del_init(&dev->list); |
| 2707 | cnic_free_dev(dev); | 2772 | cnic_free_dev(dev); |
| 2708 | } | 2773 | } |
diff --git a/drivers/net/cnic.h b/drivers/net/cnic.h index 5192d4a9df5a..a94b302bb464 100644 --- a/drivers/net/cnic.h +++ b/drivers/net/cnic.h | |||
| @@ -176,6 +176,7 @@ struct cnic_local { | |||
| 176 | unsigned long ulp_flags[MAX_CNIC_ULP_TYPE]; | 176 | unsigned long ulp_flags[MAX_CNIC_ULP_TYPE]; |
| 177 | #define ULP_F_INIT 0 | 177 | #define ULP_F_INIT 0 |
| 178 | #define ULP_F_START 1 | 178 | #define ULP_F_START 1 |
| 179 | #define ULP_F_CALL_PENDING 2 | ||
| 179 | struct cnic_ulp_ops *ulp_ops[MAX_CNIC_ULP_TYPE]; | 180 | struct cnic_ulp_ops *ulp_ops[MAX_CNIC_ULP_TYPE]; |
| 180 | 181 | ||
| 181 | /* protected by ulp_lock */ | 182 | /* protected by ulp_lock */ |
diff --git a/drivers/net/cnic_if.h b/drivers/net/cnic_if.h index d1bce27ee99e..a49235739eef 100644 --- a/drivers/net/cnic_if.h +++ b/drivers/net/cnic_if.h | |||
| @@ -290,6 +290,7 @@ struct cnic_ulp_ops { | |||
| 290 | void (*iscsi_nl_send_msg)(struct cnic_dev *dev, u32 msg_type, | 290 | void (*iscsi_nl_send_msg)(struct cnic_dev *dev, u32 msg_type, |
| 291 | char *data, u16 data_size); | 291 | char *data, u16 data_size); |
| 292 | struct module *owner; | 292 | struct module *owner; |
| 293 | atomic_t ref_count; | ||
| 293 | }; | 294 | }; |
| 294 | 295 | ||
| 295 | extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops); | 296 | extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops); |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index d56c7473144a..99df2abf82a9 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -338,10 +338,7 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw) | |||
| 338 | { | 338 | { |
| 339 | struct e1000_nvm_info *nvm = &hw->nvm; | 339 | struct e1000_nvm_info *nvm = &hw->nvm; |
| 340 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | 340 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; |
| 341 | union ich8_hws_flash_status hsfsts; | 341 | u32 gfpreg, sector_base_addr, sector_end_addr; |
| 342 | u32 gfpreg; | ||
| 343 | u32 sector_base_addr; | ||
| 344 | u32 sector_end_addr; | ||
| 345 | u16 i; | 342 | u16 i; |
| 346 | 343 | ||
| 347 | /* Can't read flash registers if the register set isn't mapped. */ | 344 | /* Can't read flash registers if the register set isn't mapped. */ |
| @@ -375,20 +372,6 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw) | |||
| 375 | /* Adjust to word count */ | 372 | /* Adjust to word count */ |
| 376 | nvm->flash_bank_size /= sizeof(u16); | 373 | nvm->flash_bank_size /= sizeof(u16); |
| 377 | 374 | ||
| 378 | /* | ||
| 379 | * Make sure the flash bank size does not overwrite the 4k | ||
| 380 | * sector ranges. We may have 64k allotted to us but we only care | ||
| 381 | * about the first 2 4k sectors. Therefore, if we have anything less | ||
| 382 | * than 64k set in the HSFSTS register, we will reduce the bank size | ||
| 383 | * down to 4k and let the rest remain unused. If berasesz == 3, then | ||
| 384 | * we are working in 64k mode. Otherwise we are not. | ||
| 385 | */ | ||
| 386 | if (nvm->flash_bank_size > E1000_ICH8_SHADOW_RAM_WORDS) { | ||
| 387 | hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); | ||
| 388 | if (hsfsts.hsf_status.berasesz != 3) | ||
| 389 | nvm->flash_bank_size = E1000_ICH8_SHADOW_RAM_WORDS; | ||
| 390 | } | ||
| 391 | |||
| 392 | nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS; | 375 | nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS; |
| 393 | 376 | ||
| 394 | /* Clear shadow ram */ | 377 | /* Clear shadow ram */ |
| @@ -594,8 +577,8 @@ static DEFINE_MUTEX(nvm_mutex); | |||
| 594 | **/ | 577 | **/ |
| 595 | static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | 578 | static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) |
| 596 | { | 579 | { |
| 597 | u32 extcnf_ctrl; | 580 | u32 extcnf_ctrl, timeout = PHY_CFG_TIMEOUT; |
| 598 | u32 timeout = PHY_CFG_TIMEOUT; | 581 | s32 ret_val = 0; |
| 599 | 582 | ||
| 600 | might_sleep(); | 583 | might_sleep(); |
| 601 | 584 | ||
| @@ -603,28 +586,46 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
| 603 | 586 | ||
| 604 | while (timeout) { | 587 | while (timeout) { |
| 605 | extcnf_ctrl = er32(EXTCNF_CTRL); | 588 | extcnf_ctrl = er32(EXTCNF_CTRL); |
| 589 | if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) | ||
| 590 | break; | ||
| 606 | 591 | ||
| 607 | if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) { | 592 | mdelay(1); |
| 608 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | 593 | timeout--; |
| 609 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 594 | } |
| 595 | |||
| 596 | if (!timeout) { | ||
| 597 | hw_dbg(hw, "SW/FW/HW has locked the resource for too long.\n"); | ||
| 598 | ret_val = -E1000_ERR_CONFIG; | ||
| 599 | goto out; | ||
| 600 | } | ||
| 601 | |||
| 602 | timeout = PHY_CFG_TIMEOUT * 2; | ||
| 603 | |||
| 604 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | ||
| 605 | ew32(EXTCNF_CTRL, extcnf_ctrl); | ||
| 606 | |||
| 607 | while (timeout) { | ||
| 608 | extcnf_ctrl = er32(EXTCNF_CTRL); | ||
| 609 | if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) | ||
| 610 | break; | ||
| 610 | 611 | ||
| 611 | extcnf_ctrl = er32(EXTCNF_CTRL); | ||
| 612 | if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) | ||
| 613 | break; | ||
| 614 | } | ||
| 615 | mdelay(1); | 612 | mdelay(1); |
| 616 | timeout--; | 613 | timeout--; |
| 617 | } | 614 | } |
| 618 | 615 | ||
| 619 | if (!timeout) { | 616 | if (!timeout) { |
| 620 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); | 617 | hw_dbg(hw, "Failed to acquire the semaphore.\n"); |
| 621 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 618 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
| 622 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 619 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
| 623 | mutex_unlock(&nvm_mutex); | 620 | ret_val = -E1000_ERR_CONFIG; |
| 624 | return -E1000_ERR_CONFIG; | 621 | goto out; |
| 625 | } | 622 | } |
| 626 | 623 | ||
| 627 | return 0; | 624 | out: |
| 625 | if (ret_val) | ||
| 626 | mutex_unlock(&nvm_mutex); | ||
| 627 | |||
| 628 | return ret_val; | ||
| 628 | } | 629 | } |
| 629 | 630 | ||
| 630 | /** | 631 | /** |
| @@ -1306,7 +1307,7 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 1306 | struct e1000_nvm_info *nvm = &hw->nvm; | 1307 | struct e1000_nvm_info *nvm = &hw->nvm; |
| 1307 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | 1308 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; |
| 1308 | u32 act_offset; | 1309 | u32 act_offset; |
| 1309 | s32 ret_val; | 1310 | s32 ret_val = 0; |
| 1310 | u32 bank = 0; | 1311 | u32 bank = 0; |
| 1311 | u16 i, word; | 1312 | u16 i, word; |
| 1312 | 1313 | ||
| @@ -1321,12 +1322,15 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 1321 | goto out; | 1322 | goto out; |
| 1322 | 1323 | ||
| 1323 | ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); | 1324 | ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); |
| 1324 | if (ret_val) | 1325 | if (ret_val) { |
| 1325 | goto release; | 1326 | hw_dbg(hw, "Could not detect valid bank, assuming bank 0\n"); |
| 1327 | bank = 0; | ||
| 1328 | } | ||
| 1326 | 1329 | ||
| 1327 | act_offset = (bank) ? nvm->flash_bank_size : 0; | 1330 | act_offset = (bank) ? nvm->flash_bank_size : 0; |
| 1328 | act_offset += offset; | 1331 | act_offset += offset; |
| 1329 | 1332 | ||
| 1333 | ret_val = 0; | ||
| 1330 | for (i = 0; i < words; i++) { | 1334 | for (i = 0; i < words; i++) { |
| 1331 | if ((dev_spec->shadow_ram) && | 1335 | if ((dev_spec->shadow_ram) && |
| 1332 | (dev_spec->shadow_ram[offset+i].modified)) { | 1336 | (dev_spec->shadow_ram[offset+i].modified)) { |
| @@ -1341,7 +1345,6 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 1341 | } | 1345 | } |
| 1342 | } | 1346 | } |
| 1343 | 1347 | ||
| 1344 | release: | ||
| 1345 | e1000_release_swflag_ich8lan(hw); | 1348 | e1000_release_swflag_ich8lan(hw); |
| 1346 | 1349 | ||
| 1347 | out: | 1350 | out: |
| @@ -1592,7 +1595,6 @@ static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 1592 | { | 1595 | { |
| 1593 | struct e1000_nvm_info *nvm = &hw->nvm; | 1596 | struct e1000_nvm_info *nvm = &hw->nvm; |
| 1594 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | 1597 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; |
| 1595 | s32 ret_val; | ||
| 1596 | u16 i; | 1598 | u16 i; |
| 1597 | 1599 | ||
| 1598 | if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) || | 1600 | if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) || |
| @@ -1601,17 +1603,11 @@ static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 1601 | return -E1000_ERR_NVM; | 1603 | return -E1000_ERR_NVM; |
| 1602 | } | 1604 | } |
| 1603 | 1605 | ||
| 1604 | ret_val = e1000_acquire_swflag_ich8lan(hw); | ||
| 1605 | if (ret_val) | ||
| 1606 | return ret_val; | ||
| 1607 | |||
| 1608 | for (i = 0; i < words; i++) { | 1606 | for (i = 0; i < words; i++) { |
| 1609 | dev_spec->shadow_ram[offset+i].modified = 1; | 1607 | dev_spec->shadow_ram[offset+i].modified = 1; |
| 1610 | dev_spec->shadow_ram[offset+i].value = data[i]; | 1608 | dev_spec->shadow_ram[offset+i].value = data[i]; |
| 1611 | } | 1609 | } |
| 1612 | 1610 | ||
| 1613 | e1000_release_swflag_ich8lan(hw); | ||
| 1614 | |||
| 1615 | return 0; | 1611 | return 0; |
| 1616 | } | 1612 | } |
| 1617 | 1613 | ||
| @@ -1652,8 +1648,8 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
| 1652 | */ | 1648 | */ |
| 1653 | ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); | 1649 | ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); |
| 1654 | if (ret_val) { | 1650 | if (ret_val) { |
| 1655 | e1000_release_swflag_ich8lan(hw); | 1651 | hw_dbg(hw, "Could not detect valid bank, assuming bank 0\n"); |
| 1656 | goto out; | 1652 | bank = 0; |
| 1657 | } | 1653 | } |
| 1658 | 1654 | ||
| 1659 | if (bank == 0) { | 1655 | if (bank == 0) { |
| @@ -2039,12 +2035,8 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank) | |||
| 2039 | iteration = 1; | 2035 | iteration = 1; |
| 2040 | break; | 2036 | break; |
| 2041 | case 2: | 2037 | case 2: |
| 2042 | if (hw->mac.type == e1000_ich9lan) { | 2038 | sector_size = ICH_FLASH_SEG_SIZE_8K; |
| 2043 | sector_size = ICH_FLASH_SEG_SIZE_8K; | 2039 | iteration = 1; |
| 2044 | iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_8K; | ||
| 2045 | } else { | ||
| 2046 | return -E1000_ERR_NVM; | ||
| 2047 | } | ||
| 2048 | break; | 2040 | break; |
| 2049 | case 3: | 2041 | case 3: |
| 2050 | sector_size = ICH_FLASH_SEG_SIZE_64K; | 2042 | sector_size = ICH_FLASH_SEG_SIZE_64K; |
| @@ -2056,7 +2048,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank) | |||
| 2056 | 2048 | ||
| 2057 | /* Start with the base address, then add the sector offset. */ | 2049 | /* Start with the base address, then add the sector offset. */ |
| 2058 | flash_linear_addr = hw->nvm.flash_base_addr; | 2050 | flash_linear_addr = hw->nvm.flash_base_addr; |
| 2059 | flash_linear_addr += (bank) ? (sector_size * iteration) : 0; | 2051 | flash_linear_addr += (bank) ? flash_bank_size : 0; |
| 2060 | 2052 | ||
| 2061 | for (j = 0; j < iteration ; j++) { | 2053 | for (j = 0; j < iteration ; j++) { |
| 2062 | do { | 2054 | do { |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 63415bb6f48f..fa92a683aefd 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -4538,8 +4538,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) | |||
| 4538 | /* Allow time for pending master requests to run */ | 4538 | /* Allow time for pending master requests to run */ |
| 4539 | e1000e_disable_pcie_master(&adapter->hw); | 4539 | e1000e_disable_pcie_master(&adapter->hw); |
| 4540 | 4540 | ||
| 4541 | if ((adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) && | 4541 | if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) { |
| 4542 | !(hw->mac.ops.check_mng_mode(hw))) { | ||
| 4543 | /* enable wakeup by the PHY */ | 4542 | /* enable wakeup by the PHY */ |
| 4544 | retval = e1000_init_phy_wakeup(adapter, wufc); | 4543 | retval = e1000_init_phy_wakeup(adapter, wufc); |
| 4545 | if (retval) | 4544 | if (retval) |
| @@ -4557,7 +4556,8 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) | |||
| 4557 | *enable_wake = !!wufc; | 4556 | *enable_wake = !!wufc; |
| 4558 | 4557 | ||
| 4559 | /* make sure adapter isn't asleep if manageability is enabled */ | 4558 | /* make sure adapter isn't asleep if manageability is enabled */ |
| 4560 | if (adapter->flags & FLAG_MNG_PT_ENABLED) | 4559 | if ((adapter->flags & FLAG_MNG_PT_ENABLED) || |
| 4560 | (hw->mac.ops.check_mng_mode(hw))) | ||
| 4561 | *enable_wake = true; | 4561 | *enable_wake = true; |
| 4562 | 4562 | ||
| 4563 | if (adapter->hw.phy.type == e1000_phy_igp_3) | 4563 | if (adapter->hw.phy.type == e1000_phy_igp_3) |
| @@ -4670,14 +4670,6 @@ static int e1000_resume(struct pci_dev *pdev) | |||
| 4670 | return err; | 4670 | return err; |
| 4671 | } | 4671 | } |
| 4672 | 4672 | ||
| 4673 | /* AER (Advanced Error Reporting) hooks */ | ||
| 4674 | err = pci_enable_pcie_error_reporting(pdev); | ||
| 4675 | if (err) { | ||
| 4676 | dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed " | ||
| 4677 | "0x%x\n", err); | ||
| 4678 | /* non-fatal, continue */ | ||
| 4679 | } | ||
| 4680 | |||
| 4681 | pci_set_master(pdev); | 4673 | pci_set_master(pdev); |
| 4682 | 4674 | ||
| 4683 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4675 | pci_enable_wake(pdev, PCI_D3hot, 0); |
| @@ -4990,6 +4982,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4990 | if (err) | 4982 | if (err) |
| 4991 | goto err_pci_reg; | 4983 | goto err_pci_reg; |
| 4992 | 4984 | ||
| 4985 | /* AER (Advanced Error Reporting) hooks */ | ||
| 4986 | err = pci_enable_pcie_error_reporting(pdev); | ||
| 4987 | if (err) { | ||
| 4988 | dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed " | ||
| 4989 | "0x%x\n", err); | ||
| 4990 | /* non-fatal, continue */ | ||
| 4991 | } | ||
| 4992 | |||
| 4993 | pci_set_master(pdev); | 4993 | pci_set_master(pdev); |
| 4994 | /* PCI config space info */ | 4994 | /* PCI config space info */ |
| 4995 | err = pci_save_state(pdev); | 4995 | err = pci_save_state(pdev); |
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index d4b98074b1b7..c9fd82d3a80d 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
| @@ -285,6 +285,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 285 | { | 285 | { |
| 286 | struct fec_enet_private *fep = netdev_priv(dev); | 286 | struct fec_enet_private *fep = netdev_priv(dev); |
| 287 | struct bufdesc *bdp; | 287 | struct bufdesc *bdp; |
| 288 | void *bufaddr; | ||
| 288 | unsigned short status; | 289 | unsigned short status; |
| 289 | unsigned long flags; | 290 | unsigned long flags; |
| 290 | 291 | ||
| @@ -312,7 +313,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 312 | status &= ~BD_ENET_TX_STATS; | 313 | status &= ~BD_ENET_TX_STATS; |
| 313 | 314 | ||
| 314 | /* Set buffer length and buffer pointer */ | 315 | /* Set buffer length and buffer pointer */ |
| 315 | bdp->cbd_bufaddr = __pa(skb->data); | 316 | bufaddr = skb->data; |
| 316 | bdp->cbd_datlen = skb->len; | 317 | bdp->cbd_datlen = skb->len; |
| 317 | 318 | ||
| 318 | /* | 319 | /* |
| @@ -320,11 +321,11 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 320 | * 4-byte boundaries. Use bounce buffers to copy data | 321 | * 4-byte boundaries. Use bounce buffers to copy data |
| 321 | * and get it aligned. Ugh. | 322 | * and get it aligned. Ugh. |
| 322 | */ | 323 | */ |
| 323 | if (bdp->cbd_bufaddr & FEC_ALIGNMENT) { | 324 | if (((unsigned long) bufaddr) & FEC_ALIGNMENT) { |
| 324 | unsigned int index; | 325 | unsigned int index; |
| 325 | index = bdp - fep->tx_bd_base; | 326 | index = bdp - fep->tx_bd_base; |
| 326 | memcpy(fep->tx_bounce[index], (void *)skb->data, skb->len); | 327 | memcpy(fep->tx_bounce[index], (void *)skb->data, skb->len); |
| 327 | bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]); | 328 | bufaddr = fep->tx_bounce[index]; |
| 328 | } | 329 | } |
| 329 | 330 | ||
| 330 | /* Save skb pointer */ | 331 | /* Save skb pointer */ |
| @@ -336,7 +337,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 336 | /* Push the data cache so the CPM does not get stale memory | 337 | /* Push the data cache so the CPM does not get stale memory |
| 337 | * data. | 338 | * data. |
| 338 | */ | 339 | */ |
| 339 | bdp->cbd_bufaddr = dma_map_single(&dev->dev, skb->data, | 340 | bdp->cbd_bufaddr = dma_map_single(&dev->dev, bufaddr, |
| 340 | FEC_ENET_TX_FRSIZE, DMA_TO_DEVICE); | 341 | FEC_ENET_TX_FRSIZE, DMA_TO_DEVICE); |
| 341 | 342 | ||
| 342 | /* Send it on its way. Tell FEC it's ready, interrupt when done, | 343 | /* Send it on its way. Tell FEC it's ready, interrupt when done, |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index f8ffcbf0bc39..e212f2c5448b 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -936,6 +936,7 @@ int startup_gfar(struct net_device *dev) | |||
| 936 | struct gfar __iomem *regs = priv->regs; | 936 | struct gfar __iomem *regs = priv->regs; |
| 937 | int err = 0; | 937 | int err = 0; |
| 938 | u32 rctrl = 0; | 938 | u32 rctrl = 0; |
| 939 | u32 tctrl = 0; | ||
| 939 | u32 attrs = 0; | 940 | u32 attrs = 0; |
| 940 | 941 | ||
| 941 | gfar_write(®s->imask, IMASK_INIT_CLEAR); | 942 | gfar_write(®s->imask, IMASK_INIT_CLEAR); |
| @@ -1111,11 +1112,19 @@ int startup_gfar(struct net_device *dev) | |||
| 1111 | rctrl |= RCTRL_PADDING(priv->padding); | 1112 | rctrl |= RCTRL_PADDING(priv->padding); |
| 1112 | } | 1113 | } |
| 1113 | 1114 | ||
| 1115 | /* keep vlan related bits if it's enabled */ | ||
| 1116 | if (priv->vlgrp) { | ||
| 1117 | rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT; | ||
| 1118 | tctrl |= TCTRL_VLINS; | ||
| 1119 | } | ||
| 1120 | |||
| 1114 | /* Init rctrl based on our settings */ | 1121 | /* Init rctrl based on our settings */ |
| 1115 | gfar_write(&priv->regs->rctrl, rctrl); | 1122 | gfar_write(&priv->regs->rctrl, rctrl); |
| 1116 | 1123 | ||
| 1117 | if (dev->features & NETIF_F_IP_CSUM) | 1124 | if (dev->features & NETIF_F_IP_CSUM) |
| 1118 | gfar_write(&priv->regs->tctrl, TCTRL_INIT_CSUM); | 1125 | tctrl |= TCTRL_INIT_CSUM; |
| 1126 | |||
| 1127 | gfar_write(&priv->regs->tctrl, tctrl); | ||
| 1119 | 1128 | ||
| 1120 | /* Set the extraction length and index */ | 1129 | /* Set the extraction length and index */ |
| 1121 | attrs = ATTRELI_EL(priv->rx_stash_size) | | 1130 | attrs = ATTRELI_EL(priv->rx_stash_size) | |
| @@ -1450,7 +1459,6 @@ static void gfar_vlan_rx_register(struct net_device *dev, | |||
| 1450 | 1459 | ||
| 1451 | /* Enable VLAN tag extraction */ | 1460 | /* Enable VLAN tag extraction */ |
| 1452 | tempval = gfar_read(&priv->regs->rctrl); | 1461 | tempval = gfar_read(&priv->regs->rctrl); |
| 1453 | tempval |= RCTRL_VLEX; | ||
| 1454 | tempval |= (RCTRL_VLEX | RCTRL_PRSDEP_INIT); | 1462 | tempval |= (RCTRL_VLEX | RCTRL_PRSDEP_INIT); |
| 1455 | gfar_write(&priv->regs->rctrl, tempval); | 1463 | gfar_write(&priv->regs->rctrl, tempval); |
| 1456 | } else { | 1464 | } else { |
diff --git a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c index d0883835b0c6..fe4f2b2bff96 100644 --- a/drivers/net/irda/w83977af_ir.c +++ b/drivers/net/irda/w83977af_ir.c | |||
| @@ -115,7 +115,7 @@ static int __init w83977af_init(void) | |||
| 115 | 115 | ||
| 116 | IRDA_DEBUG(0, "%s()\n", __func__ ); | 116 | IRDA_DEBUG(0, "%s()\n", __func__ ); |
| 117 | 117 | ||
| 118 | for (i=0; (io[i] < 2000) && (i < ARRAY_SIZE(dev_self)); i++) { | 118 | for (i=0; i < ARRAY_SIZE(dev_self) && io[i] < 2000; i++) { |
| 119 | if (w83977af_open(i, io[i], irq[i], dma[i]) == 0) | 119 | if (w83977af_open(i, io[i], irq[i], dma[i]) == 0) |
| 120 | return 0; | 120 | return 0; |
| 121 | } | 121 | } |
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index e11d83d5852b..2c4dc8221dcd 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
| @@ -136,6 +136,8 @@ struct ixgbe_ring { | |||
| 136 | 136 | ||
| 137 | u8 queue_index; /* needed for multiqueue queue management */ | 137 | u8 queue_index; /* needed for multiqueue queue management */ |
| 138 | 138 | ||
| 139 | #define IXGBE_RING_RX_PS_ENABLED (u8)(1) | ||
| 140 | u8 flags; /* per ring feature flags */ | ||
| 139 | u16 head; | 141 | u16 head; |
| 140 | u16 tail; | 142 | u16 tail; |
| 141 | 143 | ||
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index 79144e950a34..dff8dfac7ed9 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
| @@ -1948,6 +1948,7 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 1948 | struct ethtool_coalesce *ec) | 1948 | struct ethtool_coalesce *ec) |
| 1949 | { | 1949 | { |
| 1950 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 1950 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 1951 | struct ixgbe_q_vector *q_vector; | ||
| 1951 | int i; | 1952 | int i; |
| 1952 | 1953 | ||
| 1953 | if (ec->tx_max_coalesced_frames_irq) | 1954 | if (ec->tx_max_coalesced_frames_irq) |
| @@ -1982,14 +1983,24 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 1982 | adapter->itr_setting = 0; | 1983 | adapter->itr_setting = 0; |
| 1983 | } | 1984 | } |
| 1984 | 1985 | ||
| 1985 | for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) { | 1986 | /* MSI/MSIx Interrupt Mode */ |
| 1986 | struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; | 1987 | if (adapter->flags & |
| 1987 | if (q_vector->txr_count && !q_vector->rxr_count) | 1988 | (IXGBE_FLAG_MSIX_ENABLED | IXGBE_FLAG_MSI_ENABLED)) { |
| 1988 | /* tx vector gets half the rate */ | 1989 | int num_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; |
| 1989 | q_vector->eitr = (adapter->eitr_param >> 1); | 1990 | for (i = 0; i < num_vectors; i++) { |
| 1990 | else | 1991 | q_vector = adapter->q_vector[i]; |
| 1991 | /* rx only or mixed */ | 1992 | if (q_vector->txr_count && !q_vector->rxr_count) |
| 1992 | q_vector->eitr = adapter->eitr_param; | 1993 | /* tx vector gets half the rate */ |
| 1994 | q_vector->eitr = (adapter->eitr_param >> 1); | ||
| 1995 | else | ||
| 1996 | /* rx only or mixed */ | ||
| 1997 | q_vector->eitr = adapter->eitr_param; | ||
| 1998 | ixgbe_write_eitr(q_vector); | ||
| 1999 | } | ||
| 2000 | /* Legacy Interrupt Mode */ | ||
| 2001 | } else { | ||
| 2002 | q_vector = adapter->q_vector[0]; | ||
| 2003 | q_vector->eitr = adapter->eitr_param; | ||
| 1993 | ixgbe_write_eitr(q_vector); | 2004 | ixgbe_write_eitr(q_vector); |
| 1994 | } | 2005 | } |
| 1995 | 2006 | ||
diff --git a/drivers/net/ixgbe/ixgbe_fcoe.c b/drivers/net/ixgbe/ixgbe_fcoe.c index fa9f24e23683..28cf104e36cc 100644 --- a/drivers/net/ixgbe/ixgbe_fcoe.c +++ b/drivers/net/ixgbe/ixgbe_fcoe.c | |||
| @@ -336,7 +336,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter, | |||
| 336 | /* return 0 to bypass going to ULD for DDPed data */ | 336 | /* return 0 to bypass going to ULD for DDPed data */ |
| 337 | if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_DDP) | 337 | if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_DDP) |
| 338 | rc = 0; | 338 | rc = 0; |
| 339 | else | 339 | else if (ddp->len) |
| 340 | rc = ddp->len; | 340 | rc = ddp->len; |
| 341 | } | 341 | } |
| 342 | 342 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 110c65ab5cb5..77b0381a2b5c 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -492,12 +492,12 @@ static void ixgbe_receive_skb(struct ixgbe_q_vector *q_vector, | |||
| 492 | 492 | ||
| 493 | skb_record_rx_queue(skb, ring->queue_index); | 493 | skb_record_rx_queue(skb, ring->queue_index); |
| 494 | if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) { | 494 | if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) { |
| 495 | if (adapter->vlgrp && is_vlan && (tag != 0)) | 495 | if (adapter->vlgrp && is_vlan && (tag & VLAN_VID_MASK)) |
| 496 | vlan_gro_receive(napi, adapter->vlgrp, tag, skb); | 496 | vlan_gro_receive(napi, adapter->vlgrp, tag, skb); |
| 497 | else | 497 | else |
| 498 | napi_gro_receive(napi, skb); | 498 | napi_gro_receive(napi, skb); |
| 499 | } else { | 499 | } else { |
| 500 | if (adapter->vlgrp && is_vlan && (tag != 0)) | 500 | if (adapter->vlgrp && is_vlan && (tag & VLAN_VID_MASK)) |
| 501 | vlan_hwaccel_rx(skb, adapter->vlgrp, tag); | 501 | vlan_hwaccel_rx(skb, adapter->vlgrp, tag); |
| 502 | else | 502 | else |
| 503 | netif_rx(skb); | 503 | netif_rx(skb); |
| @@ -585,7 +585,7 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter, | |||
| 585 | rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i); | 585 | rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i); |
| 586 | 586 | ||
| 587 | if (!bi->page_dma && | 587 | if (!bi->page_dma && |
| 588 | (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)) { | 588 | (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED)) { |
| 589 | if (!bi->page) { | 589 | if (!bi->page) { |
| 590 | bi->page = alloc_page(GFP_ATOMIC); | 590 | bi->page = alloc_page(GFP_ATOMIC); |
| 591 | if (!bi->page) { | 591 | if (!bi->page) { |
| @@ -629,7 +629,7 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter, | |||
| 629 | } | 629 | } |
| 630 | /* Refresh the desc even if buffer_addrs didn't change because | 630 | /* Refresh the desc even if buffer_addrs didn't change because |
| 631 | * each write-back erases this info. */ | 631 | * each write-back erases this info. */ |
| 632 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | 632 | if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) { |
| 633 | rx_desc->read.pkt_addr = cpu_to_le64(bi->page_dma); | 633 | rx_desc->read.pkt_addr = cpu_to_le64(bi->page_dma); |
| 634 | rx_desc->read.hdr_addr = cpu_to_le64(bi->dma); | 634 | rx_desc->read.hdr_addr = cpu_to_le64(bi->dma); |
| 635 | } else { | 635 | } else { |
| @@ -726,7 +726,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
| 726 | break; | 726 | break; |
| 727 | (*work_done)++; | 727 | (*work_done)++; |
| 728 | 728 | ||
| 729 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | 729 | if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) { |
| 730 | hdr_info = le16_to_cpu(ixgbe_get_hdr_info(rx_desc)); | 730 | hdr_info = le16_to_cpu(ixgbe_get_hdr_info(rx_desc)); |
| 731 | len = (hdr_info & IXGBE_RXDADV_HDRBUFLEN_MASK) >> | 731 | len = (hdr_info & IXGBE_RXDADV_HDRBUFLEN_MASK) >> |
| 732 | IXGBE_RXDADV_HDRBUFLEN_SHIFT; | 732 | IXGBE_RXDADV_HDRBUFLEN_SHIFT; |
| @@ -798,7 +798,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
| 798 | rx_ring->stats.packets++; | 798 | rx_ring->stats.packets++; |
| 799 | rx_ring->stats.bytes += skb->len; | 799 | rx_ring->stats.bytes += skb->len; |
| 800 | } else { | 800 | } else { |
| 801 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | 801 | if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) { |
| 802 | rx_buffer_info->skb = next_buffer->skb; | 802 | rx_buffer_info->skb = next_buffer->skb; |
| 803 | rx_buffer_info->dma = next_buffer->dma; | 803 | rx_buffer_info->dma = next_buffer->dma; |
| 804 | next_buffer->skb = skb; | 804 | next_buffer->skb = skb; |
| @@ -1898,46 +1898,19 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter) | |||
| 1898 | 1898 | ||
| 1899 | #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2 | 1899 | #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2 |
| 1900 | 1900 | ||
| 1901 | static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, int index) | 1901 | static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, |
| 1902 | struct ixgbe_ring *rx_ring) | ||
| 1902 | { | 1903 | { |
| 1903 | struct ixgbe_ring *rx_ring; | ||
| 1904 | u32 srrctl; | 1904 | u32 srrctl; |
| 1905 | int queue0 = 0; | 1905 | int index; |
| 1906 | unsigned long mask; | ||
| 1907 | struct ixgbe_ring_feature *feature = adapter->ring_feature; | 1906 | struct ixgbe_ring_feature *feature = adapter->ring_feature; |
| 1908 | 1907 | ||
| 1909 | if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | 1908 | index = rx_ring->reg_idx; |
| 1910 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | 1909 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { |
| 1911 | int dcb_i = feature[RING_F_DCB].indices; | 1910 | unsigned long mask; |
| 1912 | if (dcb_i == 8) | ||
| 1913 | queue0 = index >> 4; | ||
| 1914 | else if (dcb_i == 4) | ||
| 1915 | queue0 = index >> 5; | ||
| 1916 | else | ||
| 1917 | dev_err(&adapter->pdev->dev, "Invalid DCB " | ||
| 1918 | "configuration\n"); | ||
| 1919 | #ifdef IXGBE_FCOE | ||
| 1920 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) { | ||
| 1921 | struct ixgbe_ring_feature *f; | ||
| 1922 | |||
| 1923 | rx_ring = &adapter->rx_ring[queue0]; | ||
| 1924 | f = &adapter->ring_feature[RING_F_FCOE]; | ||
| 1925 | if ((queue0 == 0) && (index > rx_ring->reg_idx)) | ||
| 1926 | queue0 = f->mask + index - | ||
| 1927 | rx_ring->reg_idx - 1; | ||
| 1928 | } | ||
| 1929 | #endif /* IXGBE_FCOE */ | ||
| 1930 | } else { | ||
| 1931 | queue0 = index; | ||
| 1932 | } | ||
| 1933 | } else { | ||
| 1934 | mask = (unsigned long) feature[RING_F_RSS].mask; | 1911 | mask = (unsigned long) feature[RING_F_RSS].mask; |
| 1935 | queue0 = index & mask; | ||
| 1936 | index = index & mask; | 1912 | index = index & mask; |
| 1937 | } | 1913 | } |
| 1938 | |||
| 1939 | rx_ring = &adapter->rx_ring[queue0]; | ||
| 1940 | |||
| 1941 | srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(index)); | 1914 | srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(index)); |
| 1942 | 1915 | ||
| 1943 | srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK; | 1916 | srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK; |
| @@ -1946,7 +1919,7 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, int index) | |||
| 1946 | srrctl |= (IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) & | 1919 | srrctl |= (IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) & |
| 1947 | IXGBE_SRRCTL_BSIZEHDR_MASK; | 1920 | IXGBE_SRRCTL_BSIZEHDR_MASK; |
| 1948 | 1921 | ||
| 1949 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | 1922 | if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) { |
| 1950 | #if (PAGE_SIZE / 2) > IXGBE_MAX_RXBUFFER | 1923 | #if (PAGE_SIZE / 2) > IXGBE_MAX_RXBUFFER |
| 1951 | srrctl |= IXGBE_MAX_RXBUFFER >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; | 1924 | srrctl |= IXGBE_MAX_RXBUFFER >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; |
| 1952 | #else | 1925 | #else |
| @@ -2002,6 +1975,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2002 | { | 1975 | { |
| 2003 | u64 rdba; | 1976 | u64 rdba; |
| 2004 | struct ixgbe_hw *hw = &adapter->hw; | 1977 | struct ixgbe_hw *hw = &adapter->hw; |
| 1978 | struct ixgbe_ring *rx_ring; | ||
| 2005 | struct net_device *netdev = adapter->netdev; | 1979 | struct net_device *netdev = adapter->netdev; |
| 2006 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | 1980 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; |
| 2007 | int i, j; | 1981 | int i, j; |
| @@ -2018,11 +1992,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2018 | /* Decide whether to use packet split mode or not */ | 1992 | /* Decide whether to use packet split mode or not */ |
| 2019 | adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED; | 1993 | adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED; |
| 2020 | 1994 | ||
| 2021 | #ifdef IXGBE_FCOE | ||
| 2022 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) | ||
| 2023 | adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED; | ||
| 2024 | #endif /* IXGBE_FCOE */ | ||
| 2025 | |||
| 2026 | /* Set the RX buffer length according to the mode */ | 1995 | /* Set the RX buffer length according to the mode */ |
| 2027 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | 1996 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { |
| 2028 | rx_buf_len = IXGBE_RX_HDR_SIZE; | 1997 | rx_buf_len = IXGBE_RX_HDR_SIZE; |
| @@ -2070,29 +2039,35 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2070 | * the Base and Length of the Rx Descriptor Ring | 2039 | * the Base and Length of the Rx Descriptor Ring |
| 2071 | */ | 2040 | */ |
| 2072 | for (i = 0; i < adapter->num_rx_queues; i++) { | 2041 | for (i = 0; i < adapter->num_rx_queues; i++) { |
| 2073 | rdba = adapter->rx_ring[i].dma; | 2042 | rx_ring = &adapter->rx_ring[i]; |
| 2074 | j = adapter->rx_ring[i].reg_idx; | 2043 | rdba = rx_ring->dma; |
| 2044 | j = rx_ring->reg_idx; | ||
| 2075 | IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j), (rdba & DMA_BIT_MASK(32))); | 2045 | IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j), (rdba & DMA_BIT_MASK(32))); |
| 2076 | IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32)); | 2046 | IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32)); |
| 2077 | IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j), rdlen); | 2047 | IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j), rdlen); |
| 2078 | IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0); | 2048 | IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0); |
| 2079 | IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0); | 2049 | IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0); |
| 2080 | adapter->rx_ring[i].head = IXGBE_RDH(j); | 2050 | rx_ring->head = IXGBE_RDH(j); |
| 2081 | adapter->rx_ring[i].tail = IXGBE_RDT(j); | 2051 | rx_ring->tail = IXGBE_RDT(j); |
| 2082 | adapter->rx_ring[i].rx_buf_len = rx_buf_len; | 2052 | rx_ring->rx_buf_len = rx_buf_len; |
| 2053 | |||
| 2054 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) | ||
| 2055 | rx_ring->flags |= IXGBE_RING_RX_PS_ENABLED; | ||
| 2083 | 2056 | ||
| 2084 | #ifdef IXGBE_FCOE | 2057 | #ifdef IXGBE_FCOE |
| 2085 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) { | 2058 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) { |
| 2086 | struct ixgbe_ring_feature *f; | 2059 | struct ixgbe_ring_feature *f; |
| 2087 | f = &adapter->ring_feature[RING_F_FCOE]; | 2060 | f = &adapter->ring_feature[RING_F_FCOE]; |
| 2088 | if ((rx_buf_len < IXGBE_FCOE_JUMBO_FRAME_SIZE) && | 2061 | if ((i >= f->mask) && (i < f->mask + f->indices)) { |
| 2089 | (i >= f->mask) && (i < f->mask + f->indices)) | 2062 | rx_ring->flags &= ~IXGBE_RING_RX_PS_ENABLED; |
| 2090 | adapter->rx_ring[i].rx_buf_len = | 2063 | if (rx_buf_len < IXGBE_FCOE_JUMBO_FRAME_SIZE) |
| 2091 | IXGBE_FCOE_JUMBO_FRAME_SIZE; | 2064 | rx_ring->rx_buf_len = |
| 2065 | IXGBE_FCOE_JUMBO_FRAME_SIZE; | ||
| 2066 | } | ||
| 2092 | } | 2067 | } |
| 2093 | 2068 | ||
| 2094 | #endif /* IXGBE_FCOE */ | 2069 | #endif /* IXGBE_FCOE */ |
| 2095 | ixgbe_configure_srrctl(adapter, j); | 2070 | ixgbe_configure_srrctl(adapter, rx_ring); |
| 2096 | } | 2071 | } |
| 2097 | 2072 | ||
| 2098 | if (hw->mac.type == ixgbe_mac_82598EB) { | 2073 | if (hw->mac.type == ixgbe_mac_82598EB) { |
| @@ -2168,7 +2143,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2168 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { | 2143 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { |
| 2169 | /* Enable 82599 HW-RSC */ | 2144 | /* Enable 82599 HW-RSC */ |
| 2170 | for (i = 0; i < adapter->num_rx_queues; i++) { | 2145 | for (i = 0; i < adapter->num_rx_queues; i++) { |
| 2171 | j = adapter->rx_ring[i].reg_idx; | 2146 | rx_ring = &adapter->rx_ring[i]; |
| 2147 | j = rx_ring->reg_idx; | ||
| 2172 | rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(j)); | 2148 | rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(j)); |
| 2173 | rscctrl |= IXGBE_RSCCTL_RSCEN; | 2149 | rscctrl |= IXGBE_RSCCTL_RSCEN; |
| 2174 | /* | 2150 | /* |
| @@ -2176,7 +2152,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2176 | * total size of max desc * buf_len is not greater | 2152 | * total size of max desc * buf_len is not greater |
| 2177 | * than 65535 | 2153 | * than 65535 |
| 2178 | */ | 2154 | */ |
| 2179 | if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { | 2155 | if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) { |
| 2180 | #if (MAX_SKB_FRAGS > 16) | 2156 | #if (MAX_SKB_FRAGS > 16) |
| 2181 | rscctrl |= IXGBE_RSCCTL_MAXDESC_16; | 2157 | rscctrl |= IXGBE_RSCCTL_MAXDESC_16; |
| 2182 | #elif (MAX_SKB_FRAGS > 8) | 2158 | #elif (MAX_SKB_FRAGS > 8) |
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c index 91bdfdfd431f..3ac0404d0d11 100644 --- a/drivers/net/mlx4/en_rx.c +++ b/drivers/net/mlx4/en_rx.c | |||
| @@ -506,8 +506,9 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv, | |||
| 506 | PCI_DMA_FROMDEVICE); | 506 | PCI_DMA_FROMDEVICE); |
| 507 | } | 507 | } |
| 508 | /* Adjust size of last fragment to match actual length */ | 508 | /* Adjust size of last fragment to match actual length */ |
| 509 | skb_frags_rx[nr - 1].size = length - | 509 | if (nr > 0) |
| 510 | priv->frag_info[nr - 1].frag_prefix_size; | 510 | skb_frags_rx[nr - 1].size = length - |
| 511 | priv->frag_info[nr - 1].frag_prefix_size; | ||
| 511 | return nr; | 512 | return nr; |
| 512 | 513 | ||
| 513 | fail: | 514 | fail: |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index f86e05047d19..a9c1fcca5e75 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
| @@ -1254,7 +1254,7 @@ struct netxen_adapter { | |||
| 1254 | u8 mc_enabled; | 1254 | u8 mc_enabled; |
| 1255 | u8 max_mc_count; | 1255 | u8 max_mc_count; |
| 1256 | u8 rss_supported; | 1256 | u8 rss_supported; |
| 1257 | u8 resv2; | 1257 | u8 link_changed; |
| 1258 | u32 resv3; | 1258 | u32 resv3; |
| 1259 | 1259 | ||
| 1260 | u8 has_link_events; | 1260 | u8 has_link_events; |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 7acf204e38c9..5d3343ef3d86 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -184,13 +184,6 @@ void netxen_free_sw_resources(struct netxen_adapter *adapter) | |||
| 184 | kfree(recv_ctx->rds_rings); | 184 | kfree(recv_ctx->rds_rings); |
| 185 | 185 | ||
| 186 | skip_rds: | 186 | skip_rds: |
| 187 | if (recv_ctx->sds_rings == NULL) | ||
| 188 | goto skip_sds; | ||
| 189 | |||
| 190 | for(ring = 0; ring < adapter->max_sds_rings; ring++) | ||
| 191 | recv_ctx->sds_rings[ring].consumer = 0; | ||
| 192 | |||
| 193 | skip_sds: | ||
| 194 | if (adapter->tx_ring == NULL) | 187 | if (adapter->tx_ring == NULL) |
| 195 | return; | 188 | return; |
| 196 | 189 | ||
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 3cd8cfcf627b..28f270f5ac78 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -94,10 +94,6 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | |||
| 94 | 94 | ||
| 95 | MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); | 95 | MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); |
| 96 | 96 | ||
| 97 | static struct workqueue_struct *netxen_workq; | ||
| 98 | #define SCHEDULE_WORK(tp) queue_work(netxen_workq, tp) | ||
| 99 | #define FLUSH_SCHEDULED_WORK() flush_workqueue(netxen_workq) | ||
| 100 | |||
| 101 | static void netxen_watchdog(unsigned long); | 97 | static void netxen_watchdog(unsigned long); |
| 102 | 98 | ||
| 103 | static uint32_t crb_cmd_producer[4] = { | 99 | static uint32_t crb_cmd_producer[4] = { |
| @@ -171,6 +167,8 @@ netxen_free_sds_rings(struct netxen_recv_context *recv_ctx) | |||
| 171 | { | 167 | { |
| 172 | if (recv_ctx->sds_rings != NULL) | 168 | if (recv_ctx->sds_rings != NULL) |
| 173 | kfree(recv_ctx->sds_rings); | 169 | kfree(recv_ctx->sds_rings); |
| 170 | |||
| 171 | recv_ctx->sds_rings = NULL; | ||
| 174 | } | 172 | } |
| 175 | 173 | ||
| 176 | static int | 174 | static int |
| @@ -193,6 +191,21 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev) | |||
| 193 | } | 191 | } |
| 194 | 192 | ||
| 195 | static void | 193 | static void |
| 194 | netxen_napi_del(struct netxen_adapter *adapter) | ||
| 195 | { | ||
| 196 | int ring; | ||
| 197 | struct nx_host_sds_ring *sds_ring; | ||
| 198 | struct netxen_recv_context *recv_ctx = &adapter->recv_ctx; | ||
| 199 | |||
| 200 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | ||
| 201 | sds_ring = &recv_ctx->sds_rings[ring]; | ||
| 202 | netif_napi_del(&sds_ring->napi); | ||
| 203 | } | ||
| 204 | |||
| 205 | netxen_free_sds_rings(&adapter->recv_ctx); | ||
| 206 | } | ||
| 207 | |||
| 208 | static void | ||
| 196 | netxen_napi_enable(struct netxen_adapter *adapter) | 209 | netxen_napi_enable(struct netxen_adapter *adapter) |
| 197 | { | 210 | { |
| 198 | int ring; | 211 | int ring; |
| @@ -260,7 +273,7 @@ nx_update_dma_mask(struct netxen_adapter *adapter) | |||
| 260 | change = 0; | 273 | change = 0; |
| 261 | 274 | ||
| 262 | shift = NXRD32(adapter, CRB_DMA_SHIFT); | 275 | shift = NXRD32(adapter, CRB_DMA_SHIFT); |
| 263 | if (shift >= 32) | 276 | if (shift > 32) |
| 264 | return 0; | 277 | return 0; |
| 265 | 278 | ||
| 266 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9)) | 279 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9)) |
| @@ -272,7 +285,7 @@ nx_update_dma_mask(struct netxen_adapter *adapter) | |||
| 272 | old_mask = pdev->dma_mask; | 285 | old_mask = pdev->dma_mask; |
| 273 | old_cmask = pdev->dev.coherent_dma_mask; | 286 | old_cmask = pdev->dev.coherent_dma_mask; |
| 274 | 287 | ||
| 275 | mask = (1ULL<<(32+shift)) - 1; | 288 | mask = DMA_BIT_MASK(32+shift); |
| 276 | 289 | ||
| 277 | err = pci_set_dma_mask(pdev, mask); | 290 | err = pci_set_dma_mask(pdev, mask); |
| 278 | if (err) | 291 | if (err) |
| @@ -880,7 +893,6 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | |||
| 880 | spin_unlock(&adapter->tx_clean_lock); | 893 | spin_unlock(&adapter->tx_clean_lock); |
| 881 | 894 | ||
| 882 | del_timer_sync(&adapter->watchdog_timer); | 895 | del_timer_sync(&adapter->watchdog_timer); |
| 883 | FLUSH_SCHEDULED_WORK(); | ||
| 884 | } | 896 | } |
| 885 | 897 | ||
| 886 | 898 | ||
| @@ -894,10 +906,12 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
| 894 | struct nx_host_tx_ring *tx_ring; | 906 | struct nx_host_tx_ring *tx_ring; |
| 895 | 907 | ||
| 896 | err = netxen_init_firmware(adapter); | 908 | err = netxen_init_firmware(adapter); |
| 897 | if (err != 0) { | 909 | if (err) |
| 898 | printk(KERN_ERR "Failed to init firmware\n"); | 910 | return err; |
| 899 | return -EIO; | 911 | |
| 900 | } | 912 | err = netxen_napi_add(adapter, netdev); |
| 913 | if (err) | ||
| 914 | return err; | ||
| 901 | 915 | ||
| 902 | if (adapter->fw_major < 4) | 916 | if (adapter->fw_major < 4) |
| 903 | adapter->max_rds_rings = 3; | 917 | adapter->max_rds_rings = 3; |
| @@ -961,6 +975,7 @@ netxen_nic_detach(struct netxen_adapter *adapter) | |||
| 961 | netxen_free_hw_resources(adapter); | 975 | netxen_free_hw_resources(adapter); |
| 962 | netxen_release_rx_buffers(adapter); | 976 | netxen_release_rx_buffers(adapter); |
| 963 | netxen_nic_free_irq(adapter); | 977 | netxen_nic_free_irq(adapter); |
| 978 | netxen_napi_del(adapter); | ||
| 964 | netxen_free_sw_resources(adapter); | 979 | netxen_free_sw_resources(adapter); |
| 965 | 980 | ||
| 966 | adapter->is_up = 0; | 981 | adapter->is_up = 0; |
| @@ -1105,9 +1120,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1105 | 1120 | ||
| 1106 | netdev->irq = adapter->msix_entries[0].vector; | 1121 | netdev->irq = adapter->msix_entries[0].vector; |
| 1107 | 1122 | ||
| 1108 | if (netxen_napi_add(adapter, netdev)) | ||
| 1109 | goto err_out_disable_msi; | ||
| 1110 | |||
| 1111 | init_timer(&adapter->watchdog_timer); | 1123 | init_timer(&adapter->watchdog_timer); |
| 1112 | adapter->watchdog_timer.function = &netxen_watchdog; | 1124 | adapter->watchdog_timer.function = &netxen_watchdog; |
| 1113 | adapter->watchdog_timer.data = (unsigned long)adapter; | 1125 | adapter->watchdog_timer.data = (unsigned long)adapter; |
| @@ -1177,6 +1189,9 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
| 1177 | 1189 | ||
| 1178 | unregister_netdev(netdev); | 1190 | unregister_netdev(netdev); |
| 1179 | 1191 | ||
| 1192 | cancel_work_sync(&adapter->watchdog_task); | ||
| 1193 | cancel_work_sync(&adapter->tx_timeout_task); | ||
| 1194 | |||
| 1180 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { | 1195 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { |
| 1181 | netxen_nic_detach(adapter); | 1196 | netxen_nic_detach(adapter); |
| 1182 | } | 1197 | } |
| @@ -1185,7 +1200,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
| 1185 | netxen_free_adapter_offload(adapter); | 1200 | netxen_free_adapter_offload(adapter); |
| 1186 | 1201 | ||
| 1187 | netxen_teardown_intr(adapter); | 1202 | netxen_teardown_intr(adapter); |
| 1188 | netxen_free_sds_rings(&adapter->recv_ctx); | ||
| 1189 | 1203 | ||
| 1190 | netxen_cleanup_pci_map(adapter); | 1204 | netxen_cleanup_pci_map(adapter); |
| 1191 | 1205 | ||
| @@ -1211,6 +1225,9 @@ netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 1211 | if (netif_running(netdev)) | 1225 | if (netif_running(netdev)) |
| 1212 | netxen_nic_down(adapter, netdev); | 1226 | netxen_nic_down(adapter, netdev); |
| 1213 | 1227 | ||
| 1228 | cancel_work_sync(&adapter->watchdog_task); | ||
| 1229 | cancel_work_sync(&adapter->tx_timeout_task); | ||
| 1230 | |||
| 1214 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) | 1231 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) |
| 1215 | netxen_nic_detach(adapter); | 1232 | netxen_nic_detach(adapter); |
| 1216 | 1233 | ||
| @@ -1549,11 +1566,6 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter) | |||
| 1549 | "%s: Device temperature %d degrees C exceeds" | 1566 | "%s: Device temperature %d degrees C exceeds" |
| 1550 | " maximum allowed. Hardware has been shut down.\n", | 1567 | " maximum allowed. Hardware has been shut down.\n", |
| 1551 | netdev->name, temp_val); | 1568 | netdev->name, temp_val); |
| 1552 | |||
| 1553 | netif_device_detach(netdev); | ||
| 1554 | netxen_nic_down(adapter, netdev); | ||
| 1555 | netxen_nic_detach(adapter); | ||
| 1556 | |||
| 1557 | rv = 1; | 1569 | rv = 1; |
| 1558 | } else if (temp_state == NX_TEMP_WARN) { | 1570 | } else if (temp_state == NX_TEMP_WARN) { |
| 1559 | if (adapter->temp == NX_TEMP_NORMAL) { | 1571 | if (adapter->temp == NX_TEMP_NORMAL) { |
| @@ -1587,10 +1599,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup) | |||
| 1587 | netif_carrier_off(netdev); | 1599 | netif_carrier_off(netdev); |
| 1588 | netif_stop_queue(netdev); | 1600 | netif_stop_queue(netdev); |
| 1589 | } | 1601 | } |
| 1590 | 1602 | adapter->link_changed = !adapter->has_link_events; | |
| 1591 | if (!adapter->has_link_events) | ||
| 1592 | netxen_nic_set_link_parameters(adapter); | ||
| 1593 | |||
| 1594 | } else if (!adapter->ahw.linkup && linkup) { | 1603 | } else if (!adapter->ahw.linkup && linkup) { |
| 1595 | printk(KERN_INFO "%s: %s NIC Link is up\n", | 1604 | printk(KERN_INFO "%s: %s NIC Link is up\n", |
| 1596 | netxen_nic_driver_name, netdev->name); | 1605 | netxen_nic_driver_name, netdev->name); |
| @@ -1599,9 +1608,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup) | |||
| 1599 | netif_carrier_on(netdev); | 1608 | netif_carrier_on(netdev); |
| 1600 | netif_wake_queue(netdev); | 1609 | netif_wake_queue(netdev); |
| 1601 | } | 1610 | } |
| 1602 | 1611 | adapter->link_changed = !adapter->has_link_events; | |
| 1603 | if (!adapter->has_link_events) | ||
| 1604 | netxen_nic_set_link_parameters(adapter); | ||
| 1605 | } | 1612 | } |
| 1606 | } | 1613 | } |
| 1607 | 1614 | ||
| @@ -1628,11 +1635,36 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
| 1628 | netxen_advert_link_change(adapter, linkup); | 1635 | netxen_advert_link_change(adapter, linkup); |
| 1629 | } | 1636 | } |
| 1630 | 1637 | ||
| 1638 | static void netxen_nic_thermal_shutdown(struct netxen_adapter *adapter) | ||
| 1639 | { | ||
| 1640 | struct net_device *netdev = adapter->netdev; | ||
| 1641 | |||
| 1642 | netif_device_detach(netdev); | ||
| 1643 | netxen_nic_down(adapter, netdev); | ||
| 1644 | netxen_nic_detach(adapter); | ||
| 1645 | } | ||
| 1646 | |||
| 1631 | static void netxen_watchdog(unsigned long v) | 1647 | static void netxen_watchdog(unsigned long v) |
| 1632 | { | 1648 | { |
| 1633 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; | 1649 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; |
| 1634 | 1650 | ||
| 1635 | SCHEDULE_WORK(&adapter->watchdog_task); | 1651 | if (netxen_nic_check_temp(adapter)) |
| 1652 | goto do_sched; | ||
| 1653 | |||
| 1654 | if (!adapter->has_link_events) { | ||
| 1655 | netxen_nic_handle_phy_intr(adapter); | ||
| 1656 | |||
| 1657 | if (adapter->link_changed) | ||
| 1658 | goto do_sched; | ||
| 1659 | } | ||
| 1660 | |||
| 1661 | if (netif_running(adapter->netdev)) | ||
| 1662 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | ||
| 1663 | |||
| 1664 | return; | ||
| 1665 | |||
| 1666 | do_sched: | ||
| 1667 | schedule_work(&adapter->watchdog_task); | ||
| 1636 | } | 1668 | } |
| 1637 | 1669 | ||
| 1638 | void netxen_watchdog_task(struct work_struct *work) | 1670 | void netxen_watchdog_task(struct work_struct *work) |
| @@ -1640,11 +1672,13 @@ void netxen_watchdog_task(struct work_struct *work) | |||
| 1640 | struct netxen_adapter *adapter = | 1672 | struct netxen_adapter *adapter = |
| 1641 | container_of(work, struct netxen_adapter, watchdog_task); | 1673 | container_of(work, struct netxen_adapter, watchdog_task); |
| 1642 | 1674 | ||
| 1643 | if (netxen_nic_check_temp(adapter)) | 1675 | if (adapter->temp == NX_TEMP_PANIC) { |
| 1676 | netxen_nic_thermal_shutdown(adapter); | ||
| 1644 | return; | 1677 | return; |
| 1678 | } | ||
| 1645 | 1679 | ||
| 1646 | if (!adapter->has_link_events) | 1680 | if (adapter->link_changed) |
| 1647 | netxen_nic_handle_phy_intr(adapter); | 1681 | netxen_nic_set_link_parameters(adapter); |
| 1648 | 1682 | ||
| 1649 | if (netif_running(adapter->netdev)) | 1683 | if (netif_running(adapter->netdev)) |
| 1650 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | 1684 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); |
| @@ -1652,9 +1686,8 @@ void netxen_watchdog_task(struct work_struct *work) | |||
| 1652 | 1686 | ||
| 1653 | static void netxen_tx_timeout(struct net_device *netdev) | 1687 | static void netxen_tx_timeout(struct net_device *netdev) |
| 1654 | { | 1688 | { |
| 1655 | struct netxen_adapter *adapter = (struct netxen_adapter *) | 1689 | struct netxen_adapter *adapter = netdev_priv(netdev); |
| 1656 | netdev_priv(netdev); | 1690 | schedule_work(&adapter->tx_timeout_task); |
| 1657 | SCHEDULE_WORK(&adapter->tx_timeout_task); | ||
| 1658 | } | 1691 | } |
| 1659 | 1692 | ||
| 1660 | static void netxen_tx_timeout_task(struct work_struct *work) | 1693 | static void netxen_tx_timeout_task(struct work_struct *work) |
| @@ -1811,9 +1844,6 @@ static int __init netxen_init_module(void) | |||
| 1811 | { | 1844 | { |
| 1812 | printk(KERN_INFO "%s\n", netxen_nic_driver_string); | 1845 | printk(KERN_INFO "%s\n", netxen_nic_driver_string); |
| 1813 | 1846 | ||
| 1814 | if ((netxen_workq = create_singlethread_workqueue("netxen")) == NULL) | ||
| 1815 | return -ENOMEM; | ||
| 1816 | |||
| 1817 | return pci_register_driver(&netxen_driver); | 1847 | return pci_register_driver(&netxen_driver); |
| 1818 | } | 1848 | } |
| 1819 | 1849 | ||
| @@ -1822,7 +1852,6 @@ module_init(netxen_init_module); | |||
| 1822 | static void __exit netxen_exit_module(void) | 1852 | static void __exit netxen_exit_module(void) |
| 1823 | { | 1853 | { |
| 1824 | pci_unregister_driver(&netxen_driver); | 1854 | pci_unregister_driver(&netxen_driver); |
| 1825 | destroy_workqueue(netxen_workq); | ||
| 1826 | } | 1855 | } |
| 1827 | 1856 | ||
| 1828 | module_exit(netxen_exit_module); | 1857 | module_exit(netxen_exit_module); |
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index a646a445fda9..23e1a0750fe0 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
| @@ -1839,7 +1839,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
| 1839 | lp->chip_version = chip_version; | 1839 | lp->chip_version = chip_version; |
| 1840 | lp->msg_enable = pcnet32_debug; | 1840 | lp->msg_enable = pcnet32_debug; |
| 1841 | if ((cards_found >= MAX_UNITS) | 1841 | if ((cards_found >= MAX_UNITS) |
| 1842 | || (options[cards_found] > sizeof(options_mapping))) | 1842 | || (options[cards_found] >= sizeof(options_mapping))) |
| 1843 | lp->options = PCNET32_PORT_ASEL; | 1843 | lp->options = PCNET32_PORT_ASEL; |
| 1844 | else | 1844 | else |
| 1845 | lp->options = options_mapping[options[cards_found]]; | 1845 | lp->options = options_mapping[options[cards_found]]; |
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index 99a63649f4fc..4cf9a6588751 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c | |||
| @@ -652,8 +652,9 @@ tulip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 652 | int entry; | 652 | int entry; |
| 653 | u32 flag; | 653 | u32 flag; |
| 654 | dma_addr_t mapping; | 654 | dma_addr_t mapping; |
| 655 | unsigned long flags; | ||
| 655 | 656 | ||
| 656 | spin_lock_irq(&tp->lock); | 657 | spin_lock_irqsave(&tp->lock, flags); |
| 657 | 658 | ||
| 658 | /* Calculate the next Tx descriptor entry. */ | 659 | /* Calculate the next Tx descriptor entry. */ |
| 659 | entry = tp->cur_tx % TX_RING_SIZE; | 660 | entry = tp->cur_tx % TX_RING_SIZE; |
| @@ -688,7 +689,7 @@ tulip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 688 | /* Trigger an immediate transmit demand. */ | 689 | /* Trigger an immediate transmit demand. */ |
| 689 | iowrite32(0, tp->base_addr + CSR1); | 690 | iowrite32(0, tp->base_addr + CSR1); |
| 690 | 691 | ||
| 691 | spin_unlock_irq(&tp->lock); | 692 | spin_unlock_irqrestore(&tp->lock, flags); |
| 692 | 693 | ||
| 693 | dev->trans_start = jiffies; | 694 | dev->trans_start = jiffies; |
| 694 | 695 | ||
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 027f7aba26af..42b6c6319bc2 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -1048,20 +1048,15 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
| 1048 | return err; | 1048 | return err; |
| 1049 | } | 1049 | } |
| 1050 | 1050 | ||
| 1051 | static int tun_get_iff(struct net *net, struct file *file, struct ifreq *ifr) | 1051 | static int tun_get_iff(struct net *net, struct tun_struct *tun, |
| 1052 | struct ifreq *ifr) | ||
| 1052 | { | 1053 | { |
| 1053 | struct tun_struct *tun = tun_get(file); | ||
| 1054 | |||
| 1055 | if (!tun) | ||
| 1056 | return -EBADFD; | ||
| 1057 | |||
| 1058 | DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name); | 1054 | DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name); |
| 1059 | 1055 | ||
| 1060 | strcpy(ifr->ifr_name, tun->dev->name); | 1056 | strcpy(ifr->ifr_name, tun->dev->name); |
| 1061 | 1057 | ||
| 1062 | ifr->ifr_flags = tun_flags(tun); | 1058 | ifr->ifr_flags = tun_flags(tun); |
| 1063 | 1059 | ||
| 1064 | tun_put(tun); | ||
| 1065 | return 0; | 1060 | return 0; |
| 1066 | } | 1061 | } |
| 1067 | 1062 | ||
| @@ -1105,8 +1100,8 @@ static int set_offload(struct net_device *dev, unsigned long arg) | |||
| 1105 | return 0; | 1100 | return 0; |
| 1106 | } | 1101 | } |
| 1107 | 1102 | ||
| 1108 | static int tun_chr_ioctl(struct inode *inode, struct file *file, | 1103 | static long tun_chr_ioctl(struct file *file, unsigned int cmd, |
| 1109 | unsigned int cmd, unsigned long arg) | 1104 | unsigned long arg) |
| 1110 | { | 1105 | { |
| 1111 | struct tun_file *tfile = file->private_data; | 1106 | struct tun_file *tfile = file->private_data; |
| 1112 | struct tun_struct *tun; | 1107 | struct tun_struct *tun; |
| @@ -1128,34 +1123,32 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1128 | (unsigned int __user*)argp); | 1123 | (unsigned int __user*)argp); |
| 1129 | } | 1124 | } |
| 1130 | 1125 | ||
| 1126 | rtnl_lock(); | ||
| 1127 | |||
| 1131 | tun = __tun_get(tfile); | 1128 | tun = __tun_get(tfile); |
| 1132 | if (cmd == TUNSETIFF && !tun) { | 1129 | if (cmd == TUNSETIFF && !tun) { |
| 1133 | int err; | ||
| 1134 | |||
| 1135 | ifr.ifr_name[IFNAMSIZ-1] = '\0'; | 1130 | ifr.ifr_name[IFNAMSIZ-1] = '\0'; |
| 1136 | 1131 | ||
| 1137 | rtnl_lock(); | 1132 | ret = tun_set_iff(tfile->net, file, &ifr); |
| 1138 | err = tun_set_iff(tfile->net, file, &ifr); | ||
| 1139 | rtnl_unlock(); | ||
| 1140 | 1133 | ||
| 1141 | if (err) | 1134 | if (ret) |
| 1142 | return err; | 1135 | goto unlock; |
| 1143 | 1136 | ||
| 1144 | if (copy_to_user(argp, &ifr, sizeof(ifr))) | 1137 | if (copy_to_user(argp, &ifr, sizeof(ifr))) |
| 1145 | return -EFAULT; | 1138 | ret = -EFAULT; |
| 1146 | return 0; | 1139 | goto unlock; |
| 1147 | } | 1140 | } |
| 1148 | 1141 | ||
| 1149 | 1142 | ret = -EBADFD; | |
| 1150 | if (!tun) | 1143 | if (!tun) |
| 1151 | return -EBADFD; | 1144 | goto unlock; |
| 1152 | 1145 | ||
| 1153 | DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd); | 1146 | DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd); |
| 1154 | 1147 | ||
| 1155 | ret = 0; | 1148 | ret = 0; |
| 1156 | switch (cmd) { | 1149 | switch (cmd) { |
| 1157 | case TUNGETIFF: | 1150 | case TUNGETIFF: |
| 1158 | ret = tun_get_iff(current->nsproxy->net_ns, file, &ifr); | 1151 | ret = tun_get_iff(current->nsproxy->net_ns, tun, &ifr); |
| 1159 | if (ret) | 1152 | if (ret) |
| 1160 | break; | 1153 | break; |
| 1161 | 1154 | ||
| @@ -1201,7 +1194,6 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1201 | 1194 | ||
| 1202 | case TUNSETLINK: | 1195 | case TUNSETLINK: |
| 1203 | /* Only allow setting the type when the interface is down */ | 1196 | /* Only allow setting the type when the interface is down */ |
| 1204 | rtnl_lock(); | ||
| 1205 | if (tun->dev->flags & IFF_UP) { | 1197 | if (tun->dev->flags & IFF_UP) { |
| 1206 | DBG(KERN_INFO "%s: Linktype set failed because interface is up\n", | 1198 | DBG(KERN_INFO "%s: Linktype set failed because interface is up\n", |
| 1207 | tun->dev->name); | 1199 | tun->dev->name); |
| @@ -1211,7 +1203,6 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1211 | DBG(KERN_INFO "%s: linktype set to %d\n", tun->dev->name, tun->dev->type); | 1203 | DBG(KERN_INFO "%s: linktype set to %d\n", tun->dev->name, tun->dev->type); |
| 1212 | ret = 0; | 1204 | ret = 0; |
| 1213 | } | 1205 | } |
| 1214 | rtnl_unlock(); | ||
| 1215 | break; | 1206 | break; |
| 1216 | 1207 | ||
| 1217 | #ifdef TUN_DEBUG | 1208 | #ifdef TUN_DEBUG |
| @@ -1220,9 +1211,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1220 | break; | 1211 | break; |
| 1221 | #endif | 1212 | #endif |
| 1222 | case TUNSETOFFLOAD: | 1213 | case TUNSETOFFLOAD: |
| 1223 | rtnl_lock(); | ||
| 1224 | ret = set_offload(tun->dev, arg); | 1214 | ret = set_offload(tun->dev, arg); |
| 1225 | rtnl_unlock(); | ||
| 1226 | break; | 1215 | break; |
| 1227 | 1216 | ||
| 1228 | case TUNSETTXFILTER: | 1217 | case TUNSETTXFILTER: |
| @@ -1230,9 +1219,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1230 | ret = -EINVAL; | 1219 | ret = -EINVAL; |
| 1231 | if ((tun->flags & TUN_TYPE_MASK) != TUN_TAP_DEV) | 1220 | if ((tun->flags & TUN_TYPE_MASK) != TUN_TAP_DEV) |
| 1232 | break; | 1221 | break; |
| 1233 | rtnl_lock(); | ||
| 1234 | ret = update_filter(&tun->txflt, (void __user *)arg); | 1222 | ret = update_filter(&tun->txflt, (void __user *)arg); |
| 1235 | rtnl_unlock(); | ||
| 1236 | break; | 1223 | break; |
| 1237 | 1224 | ||
| 1238 | case SIOCGIFHWADDR: | 1225 | case SIOCGIFHWADDR: |
| @@ -1248,9 +1235,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1248 | DBG(KERN_DEBUG "%s: set hw address: %pM\n", | 1235 | DBG(KERN_DEBUG "%s: set hw address: %pM\n", |
| 1249 | tun->dev->name, ifr.ifr_hwaddr.sa_data); | 1236 | tun->dev->name, ifr.ifr_hwaddr.sa_data); |
| 1250 | 1237 | ||
| 1251 | rtnl_lock(); | ||
| 1252 | ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr); | 1238 | ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr); |
| 1253 | rtnl_unlock(); | ||
| 1254 | break; | 1239 | break; |
| 1255 | 1240 | ||
| 1256 | case TUNGETSNDBUF: | 1241 | case TUNGETSNDBUF: |
| @@ -1273,7 +1258,10 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
| 1273 | break; | 1258 | break; |
| 1274 | }; | 1259 | }; |
| 1275 | 1260 | ||
| 1276 | tun_put(tun); | 1261 | unlock: |
| 1262 | rtnl_unlock(); | ||
| 1263 | if (tun) | ||
| 1264 | tun_put(tun); | ||
| 1277 | return ret; | 1265 | return ret; |
| 1278 | } | 1266 | } |
| 1279 | 1267 | ||
| @@ -1361,7 +1349,7 @@ static const struct file_operations tun_fops = { | |||
| 1361 | .write = do_sync_write, | 1349 | .write = do_sync_write, |
| 1362 | .aio_write = tun_chr_aio_write, | 1350 | .aio_write = tun_chr_aio_write, |
| 1363 | .poll = tun_chr_poll, | 1351 | .poll = tun_chr_poll, |
| 1364 | .ioctl = tun_chr_ioctl, | 1352 | .unlocked_ioctl = tun_chr_ioctl, |
| 1365 | .open = tun_chr_open, | 1353 | .open = tun_chr_open, |
| 1366 | .release = tun_chr_close, | 1354 | .release = tun_chr_close, |
| 1367 | .fasync = tun_chr_fasync | 1355 | .fasync = tun_chr_fasync |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 3b957e6412ee..8a7b8c7bd781 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
| @@ -3111,10 +3111,11 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3111 | u8 __iomem *bd; /* BD pointer */ | 3111 | u8 __iomem *bd; /* BD pointer */ |
| 3112 | u32 bd_status; | 3112 | u32 bd_status; |
| 3113 | u8 txQ = 0; | 3113 | u8 txQ = 0; |
| 3114 | unsigned long flags; | ||
| 3114 | 3115 | ||
| 3115 | ugeth_vdbg("%s: IN", __func__); | 3116 | ugeth_vdbg("%s: IN", __func__); |
| 3116 | 3117 | ||
| 3117 | spin_lock_irq(&ugeth->lock); | 3118 | spin_lock_irqsave(&ugeth->lock, flags); |
| 3118 | 3119 | ||
| 3119 | dev->stats.tx_bytes += skb->len; | 3120 | dev->stats.tx_bytes += skb->len; |
| 3120 | 3121 | ||
| @@ -3171,7 +3172,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3171 | uccf = ugeth->uccf; | 3172 | uccf = ugeth->uccf; |
| 3172 | out_be16(uccf->p_utodr, UCC_FAST_TOD); | 3173 | out_be16(uccf->p_utodr, UCC_FAST_TOD); |
| 3173 | #endif | 3174 | #endif |
| 3174 | spin_unlock_irq(&ugeth->lock); | 3175 | spin_unlock_irqrestore(&ugeth->lock, flags); |
| 3175 | 3176 | ||
| 3176 | return 0; | 3177 | return 0; |
| 3177 | } | 3178 | } |
diff --git a/drivers/net/usb/pegasus.h b/drivers/net/usb/pegasus.h index c7467823cd1c..f968c834ff63 100644 --- a/drivers/net/usb/pegasus.h +++ b/drivers/net/usb/pegasus.h | |||
| @@ -250,6 +250,8 @@ PEGASUS_DEV( "IO DATA USB ET/TX", VENDOR_IODATA, 0x0904, | |||
| 250 | DEFAULT_GPIO_RESET ) | 250 | DEFAULT_GPIO_RESET ) |
| 251 | PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913, | 251 | PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913, |
| 252 | DEFAULT_GPIO_RESET | PEGASUS_II ) | 252 | DEFAULT_GPIO_RESET | PEGASUS_II ) |
| 253 | PEGASUS_DEV( "IO DATA USB ETX-US2", VENDOR_IODATA, 0x092a, | ||
| 254 | DEFAULT_GPIO_RESET | PEGASUS_II ) | ||
| 253 | PEGASUS_DEV( "Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a, | 255 | PEGASUS_DEV( "Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a, |
| 254 | DEFAULT_GPIO_RESET) | 256 | DEFAULT_GPIO_RESET) |
| 255 | PEGASUS_DEV( "LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x4002, | 257 | PEGASUS_DEV( "LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x4002, |
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index 88c30a58b4bd..934f7671650a 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c | |||
| @@ -1218,6 +1218,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 1218 | struct rhine_private *rp = netdev_priv(dev); | 1218 | struct rhine_private *rp = netdev_priv(dev); |
| 1219 | void __iomem *ioaddr = rp->base; | 1219 | void __iomem *ioaddr = rp->base; |
| 1220 | unsigned entry; | 1220 | unsigned entry; |
| 1221 | unsigned long flags; | ||
| 1221 | 1222 | ||
| 1222 | /* Caution: the write order is important here, set the field | 1223 | /* Caution: the write order is important here, set the field |
| 1223 | with the "ownership" bits last. */ | 1224 | with the "ownership" bits last. */ |
| @@ -1261,7 +1262,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 1261 | cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN)); | 1262 | cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN)); |
| 1262 | 1263 | ||
| 1263 | /* lock eth irq */ | 1264 | /* lock eth irq */ |
| 1264 | spin_lock_irq(&rp->lock); | 1265 | spin_lock_irqsave(&rp->lock, flags); |
| 1265 | wmb(); | 1266 | wmb(); |
| 1266 | rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); | 1267 | rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); |
| 1267 | wmb(); | 1268 | wmb(); |
| @@ -1280,7 +1281,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 1280 | 1281 | ||
| 1281 | dev->trans_start = jiffies; | 1282 | dev->trans_start = jiffies; |
| 1282 | 1283 | ||
| 1283 | spin_unlock_irq(&rp->lock); | 1284 | spin_unlock_irqrestore(&rp->lock, flags); |
| 1284 | 1285 | ||
| 1285 | if (debug > 4) { | 1286 | if (debug > 4) { |
| 1286 | printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n", | 1287 | printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n", |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index 3ba35956327a..cee08a1e497a 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
| @@ -1778,7 +1778,7 @@ static void velocity_error(struct velocity_info *vptr, int status) | |||
| 1778 | * mode | 1778 | * mode |
| 1779 | */ | 1779 | */ |
| 1780 | if (vptr->rev_id < REV_ID_VT3216_A0) { | 1780 | if (vptr->rev_id < REV_ID_VT3216_A0) { |
| 1781 | if (vptr->mii_status | VELOCITY_DUPLEX_FULL) | 1781 | if (vptr->mii_status & VELOCITY_DUPLEX_FULL) |
| 1782 | BYTE_REG_BITS_ON(TCR_TB2BDIS, ®s->TCR); | 1782 | BYTE_REG_BITS_ON(TCR_TB2BDIS, ®s->TCR); |
| 1783 | else | 1783 | else |
| 1784 | BYTE_REG_BITS_OFF(TCR_TB2BDIS, ®s->TCR); | 1784 | BYTE_REG_BITS_OFF(TCR_TB2BDIS, ®s->TCR); |
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c index 9d38cf60a0db..88c3d8573869 100644 --- a/drivers/net/wireless/ath/ar9170/main.c +++ b/drivers/net/wireless/ath/ar9170/main.c | |||
| @@ -1967,13 +1967,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue, | |||
| 1967 | int ret; | 1967 | int ret; |
| 1968 | 1968 | ||
| 1969 | mutex_lock(&ar->mutex); | 1969 | mutex_lock(&ar->mutex); |
| 1970 | if ((param) && !(queue > __AR9170_NUM_TXQ)) { | 1970 | if (queue < __AR9170_NUM_TXQ) { |
| 1971 | memcpy(&ar->edcf[ar9170_qos_hwmap[queue]], | 1971 | memcpy(&ar->edcf[ar9170_qos_hwmap[queue]], |
| 1972 | param, sizeof(*param)); | 1972 | param, sizeof(*param)); |
| 1973 | 1973 | ||
| 1974 | ret = ar9170_set_qos(ar); | 1974 | ret = ar9170_set_qos(ar); |
| 1975 | } else | 1975 | } else { |
| 1976 | ret = -EINVAL; | 1976 | ret = -EINVAL; |
| 1977 | } | ||
| 1977 | 1978 | ||
| 1978 | mutex_unlock(&ar->mutex); | 1979 | mutex_unlock(&ar->mutex); |
| 1979 | return ret; | 1980 | return ret; |
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 754b1f8d8da9..007eb85fc67e 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
| @@ -598,11 +598,15 @@ static int ar9170_usb_request_firmware(struct ar9170_usb *aru) | |||
| 598 | 598 | ||
| 599 | err = request_firmware(&aru->init_values, "ar9170-1.fw", | 599 | err = request_firmware(&aru->init_values, "ar9170-1.fw", |
| 600 | &aru->udev->dev); | 600 | &aru->udev->dev); |
| 601 | if (err) { | ||
| 602 | dev_err(&aru->udev->dev, "file with init values not found.\n"); | ||
| 603 | return err; | ||
| 604 | } | ||
| 601 | 605 | ||
| 602 | err = request_firmware(&aru->firmware, "ar9170-2.fw", &aru->udev->dev); | 606 | err = request_firmware(&aru->firmware, "ar9170-2.fw", &aru->udev->dev); |
| 603 | if (err) { | 607 | if (err) { |
| 604 | release_firmware(aru->init_values); | 608 | release_firmware(aru->init_values); |
| 605 | dev_err(&aru->udev->dev, "file with init values not found.\n"); | 609 | dev_err(&aru->udev->dev, "firmware file not found.\n"); |
| 606 | return err; | 610 | return err; |
| 607 | } | 611 | } |
| 608 | 612 | ||
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 44c29b3f6728..6dcac73b4d29 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
| @@ -6226,7 +6226,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | |||
| 6226 | }; | 6226 | }; |
| 6227 | 6227 | ||
| 6228 | u8 channel; | 6228 | u8 channel; |
| 6229 | while (channel_index < IPW_SCAN_CHANNELS) { | 6229 | while (channel_index < IPW_SCAN_CHANNELS - 1) { |
| 6230 | channel = | 6230 | channel = |
| 6231 | priv->speed_scan[priv->speed_scan_pos]; | 6231 | priv->speed_scan[priv->speed_scan_pos]; |
| 6232 | if (channel == 0) { | 6232 | if (channel == 0) { |
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index d6997371c27e..b9b374119033 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* Copyright (C) 2006, Red Hat, Inc. */ | 1 | /* Copyright (C) 2006, Red Hat, Inc. */ |
| 2 | 2 | ||
| 3 | #include <linux/types.h> | 3 | #include <linux/types.h> |
| 4 | #include <linux/kernel.h> | ||
| 5 | #include <linux/etherdevice.h> | 4 | #include <linux/etherdevice.h> |
| 6 | #include <linux/ieee80211.h> | 5 | #include <linux/ieee80211.h> |
| 7 | #include <linux/if_arp.h> | 6 | #include <linux/if_arp.h> |
| @@ -44,21 +43,21 @@ static int get_common_rates(struct lbs_private *priv, | |||
| 44 | u16 *rates_size) | 43 | u16 *rates_size) |
| 45 | { | 44 | { |
| 46 | u8 *card_rates = lbs_bg_rates; | 45 | u8 *card_rates = lbs_bg_rates; |
| 46 | size_t num_card_rates = sizeof(lbs_bg_rates); | ||
| 47 | int ret = 0, i, j; | 47 | int ret = 0, i, j; |
| 48 | u8 tmp[(ARRAY_SIZE(lbs_bg_rates) - 1) * (*rates_size - 1)]; | 48 | u8 tmp[30]; |
| 49 | size_t tmp_size = 0; | 49 | size_t tmp_size = 0; |
| 50 | 50 | ||
| 51 | /* For each rate in card_rates that exists in rate1, copy to tmp */ | 51 | /* For each rate in card_rates that exists in rate1, copy to tmp */ |
| 52 | for (i = 0; i < ARRAY_SIZE(lbs_bg_rates) && card_rates[i]; i++) { | 52 | for (i = 0; card_rates[i] && (i < num_card_rates); i++) { |
| 53 | for (j = 0; j < *rates_size && rates[j]; j++) { | 53 | for (j = 0; rates[j] && (j < *rates_size); j++) { |
| 54 | if (rates[j] == card_rates[i]) | 54 | if (rates[j] == card_rates[i]) |
| 55 | tmp[tmp_size++] = card_rates[i]; | 55 | tmp[tmp_size++] = card_rates[i]; |
| 56 | } | 56 | } |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size); | 59 | lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size); |
| 60 | lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, | 60 | lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, num_card_rates); |
| 61 | ARRAY_SIZE(lbs_bg_rates)); | ||
| 62 | lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size); | 61 | lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size); |
| 63 | lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate); | 62 | lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate); |
| 64 | 63 | ||
| @@ -70,7 +69,10 @@ static int get_common_rates(struct lbs_private *priv, | |||
| 70 | lbs_pr_alert("Previously set fixed data rate %#x isn't " | 69 | lbs_pr_alert("Previously set fixed data rate %#x isn't " |
| 71 | "compatible with the network.\n", priv->cur_rate); | 70 | "compatible with the network.\n", priv->cur_rate); |
| 72 | ret = -1; | 71 | ret = -1; |
| 72 | goto done; | ||
| 73 | } | 73 | } |
| 74 | ret = 0; | ||
| 75 | |||
| 74 | done: | 76 | done: |
| 75 | memset(rates, 0, *rates_size); | 77 | memset(rates, 0, *rates_size); |
| 76 | *rates_size = min_t(int, tmp_size, *rates_size); | 78 | *rates_size = min_t(int, tmp_size, *rates_size); |
| @@ -320,7 +322,7 @@ static int lbs_associate(struct lbs_private *priv, | |||
| 320 | rates = (struct mrvl_ie_rates_param_set *) pos; | 322 | rates = (struct mrvl_ie_rates_param_set *) pos; |
| 321 | rates->header.type = cpu_to_le16(TLV_TYPE_RATES); | 323 | rates->header.type = cpu_to_le16(TLV_TYPE_RATES); |
| 322 | memcpy(&rates->rates, &bss->rates, MAX_RATES); | 324 | memcpy(&rates->rates, &bss->rates, MAX_RATES); |
| 323 | tmplen = min_t(u16, ARRAY_SIZE(rates->rates), MAX_RATES); | 325 | tmplen = MAX_RATES; |
| 324 | if (get_common_rates(priv, rates->rates, &tmplen)) { | 326 | if (get_common_rates(priv, rates->rates, &tmplen)) { |
| 325 | ret = -1; | 327 | ret = -1; |
| 326 | goto done; | 328 | goto done; |
| @@ -596,7 +598,7 @@ static int lbs_adhoc_join(struct lbs_private *priv, | |||
| 596 | 598 | ||
| 597 | /* Copy Data rates from the rates recorded in scan response */ | 599 | /* Copy Data rates from the rates recorded in scan response */ |
| 598 | memset(cmd.bss.rates, 0, sizeof(cmd.bss.rates)); | 600 | memset(cmd.bss.rates, 0, sizeof(cmd.bss.rates)); |
| 599 | ratesize = min_t(u16, ARRAY_SIZE(cmd.bss.rates), MAX_RATES); | 601 | ratesize = min_t(u16, sizeof(cmd.bss.rates), MAX_RATES); |
| 600 | memcpy(cmd.bss.rates, bss->rates, ratesize); | 602 | memcpy(cmd.bss.rates, bss->rates, ratesize); |
| 601 | if (get_common_rates(priv, cmd.bss.rates, &ratesize)) { | 603 | if (get_common_rates(priv, cmd.bss.rates, &ratesize)) { |
| 602 | lbs_deb_join("ADHOC_JOIN: get_common_rates returned error.\n"); | 604 | lbs_deb_join("ADHOC_JOIN: get_common_rates returned error.\n"); |
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h index 0a2e29140add..c8a1998d4744 100644 --- a/drivers/net/wireless/libertas/hostcmd.h +++ b/drivers/net/wireless/libertas/hostcmd.h | |||
| @@ -56,8 +56,8 @@ struct rxpd { | |||
| 56 | u8 bss_type; | 56 | u8 bss_type; |
| 57 | /* BSS number */ | 57 | /* BSS number */ |
| 58 | u8 bss_num; | 58 | u8 bss_num; |
| 59 | } bss; | 59 | } __attribute__ ((packed)) bss; |
| 60 | } u; | 60 | } __attribute__ ((packed)) u; |
| 61 | 61 | ||
| 62 | /* SNR */ | 62 | /* SNR */ |
| 63 | u8 snr; | 63 | u8 snr; |
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c index a263d5c84c08..83967afe0821 100644 --- a/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c | |||
| @@ -261,7 +261,7 @@ struct mwl8k_vif { | |||
| 261 | */ | 261 | */ |
| 262 | }; | 262 | }; |
| 263 | 263 | ||
| 264 | #define MWL8K_VIF(_vif) (struct mwl8k_vif *)(&((_vif)->drv_priv)) | 264 | #define MWL8K_VIF(_vif) ((struct mwl8k_vif *)&((_vif)->drv_priv)) |
| 265 | 265 | ||
| 266 | static const struct ieee80211_channel mwl8k_channels[] = { | 266 | static const struct ieee80211_channel mwl8k_channels[] = { |
| 267 | { .center_freq = 2412, .hw_value = 1, }, | 267 | { .center_freq = 2412, .hw_value = 1, }, |
| @@ -1012,6 +1012,8 @@ static int rxq_process(struct ieee80211_hw *hw, int index, int limit) | |||
| 1012 | rmb(); | 1012 | rmb(); |
| 1013 | 1013 | ||
| 1014 | skb = rxq->rx_skb[rxq->rx_head]; | 1014 | skb = rxq->rx_skb[rxq->rx_head]; |
| 1015 | if (skb == NULL) | ||
| 1016 | break; | ||
| 1015 | rxq->rx_skb[rxq->rx_head] = NULL; | 1017 | rxq->rx_skb[rxq->rx_head] = NULL; |
| 1016 | 1018 | ||
| 1017 | rxq->rx_head = (rxq->rx_head + 1) % MWL8K_RX_DESCS; | 1019 | rxq->rx_head = (rxq->rx_head + 1) % MWL8K_RX_DESCS; |
| @@ -1591,6 +1593,9 @@ static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd) | |||
| 1591 | timeout = wait_for_completion_timeout(&cmd_wait, | 1593 | timeout = wait_for_completion_timeout(&cmd_wait, |
| 1592 | msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS)); | 1594 | msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS)); |
| 1593 | 1595 | ||
| 1596 | pci_unmap_single(priv->pdev, dma_addr, dma_size, | ||
| 1597 | PCI_DMA_BIDIRECTIONAL); | ||
| 1598 | |||
| 1594 | result = &cmd->result; | 1599 | result = &cmd->result; |
| 1595 | if (!timeout) { | 1600 | if (!timeout) { |
| 1596 | spin_lock_irq(&priv->fw_lock); | 1601 | spin_lock_irq(&priv->fw_lock); |
| @@ -1610,8 +1615,6 @@ static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd) | |||
| 1610 | *result); | 1615 | *result); |
| 1611 | } | 1616 | } |
| 1612 | 1617 | ||
| 1613 | pci_unmap_single(priv->pdev, dma_addr, dma_size, | ||
| 1614 | PCI_DMA_BIDIRECTIONAL); | ||
| 1615 | return rc; | 1618 | return rc; |
| 1616 | } | 1619 | } |
| 1617 | 1620 | ||
| @@ -1654,18 +1657,18 @@ static int mwl8k_cmd_get_hw_spec(struct ieee80211_hw *hw) | |||
| 1654 | memset(cmd->perm_addr, 0xff, sizeof(cmd->perm_addr)); | 1657 | memset(cmd->perm_addr, 0xff, sizeof(cmd->perm_addr)); |
| 1655 | cmd->ps_cookie = cpu_to_le32(priv->cookie_dma); | 1658 | cmd->ps_cookie = cpu_to_le32(priv->cookie_dma); |
| 1656 | cmd->rx_queue_ptr = cpu_to_le32(priv->rxq[0].rx_desc_dma); | 1659 | cmd->rx_queue_ptr = cpu_to_le32(priv->rxq[0].rx_desc_dma); |
| 1657 | cmd->num_tx_queues = MWL8K_TX_QUEUES; | 1660 | cmd->num_tx_queues = cpu_to_le32(MWL8K_TX_QUEUES); |
| 1658 | for (i = 0; i < MWL8K_TX_QUEUES; i++) | 1661 | for (i = 0; i < MWL8K_TX_QUEUES; i++) |
| 1659 | cmd->tx_queue_ptrs[i] = cpu_to_le32(priv->txq[i].tx_desc_dma); | 1662 | cmd->tx_queue_ptrs[i] = cpu_to_le32(priv->txq[i].tx_desc_dma); |
| 1660 | cmd->num_tx_desc_per_queue = MWL8K_TX_DESCS; | 1663 | cmd->num_tx_desc_per_queue = cpu_to_le32(MWL8K_TX_DESCS); |
| 1661 | cmd->total_rx_desc = MWL8K_RX_DESCS; | 1664 | cmd->total_rx_desc = cpu_to_le32(MWL8K_RX_DESCS); |
| 1662 | 1665 | ||
| 1663 | rc = mwl8k_post_cmd(hw, &cmd->header); | 1666 | rc = mwl8k_post_cmd(hw, &cmd->header); |
| 1664 | 1667 | ||
| 1665 | if (!rc) { | 1668 | if (!rc) { |
| 1666 | SET_IEEE80211_PERM_ADDR(hw, cmd->perm_addr); | 1669 | SET_IEEE80211_PERM_ADDR(hw, cmd->perm_addr); |
| 1667 | priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs); | 1670 | priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs); |
| 1668 | priv->fw_rev = cmd->fw_rev; | 1671 | priv->fw_rev = le32_to_cpu(cmd->fw_rev); |
| 1669 | priv->hw_rev = cmd->hw_rev; | 1672 | priv->hw_rev = cmd->hw_rev; |
| 1670 | priv->region_code = le16_to_cpu(cmd->region_code); | 1673 | priv->region_code = le16_to_cpu(cmd->region_code); |
| 1671 | } | 1674 | } |
| @@ -3216,15 +3219,19 @@ static int mwl8k_configure_filter_wt(struct work_struct *wt) | |||
| 3216 | struct dev_addr_list *mclist = worker->mclist; | 3219 | struct dev_addr_list *mclist = worker->mclist; |
| 3217 | 3220 | ||
| 3218 | struct mwl8k_priv *priv = hw->priv; | 3221 | struct mwl8k_priv *priv = hw->priv; |
| 3219 | struct mwl8k_vif *mv_vif; | ||
| 3220 | int rc = 0; | 3222 | int rc = 0; |
| 3221 | 3223 | ||
| 3222 | if (changed_flags & FIF_BCN_PRBRESP_PROMISC) { | 3224 | if (changed_flags & FIF_BCN_PRBRESP_PROMISC) { |
| 3223 | if (*total_flags & FIF_BCN_PRBRESP_PROMISC) | 3225 | if (*total_flags & FIF_BCN_PRBRESP_PROMISC) |
| 3224 | rc = mwl8k_cmd_set_pre_scan(hw); | 3226 | rc = mwl8k_cmd_set_pre_scan(hw); |
| 3225 | else { | 3227 | else { |
| 3226 | mv_vif = MWL8K_VIF(priv->vif); | 3228 | u8 *bssid; |
| 3227 | rc = mwl8k_cmd_set_post_scan(hw, mv_vif->bssid); | 3229 | |
| 3230 | bssid = "\x00\x00\x00\x00\x00\x00"; | ||
| 3231 | if (priv->vif != NULL) | ||
| 3232 | bssid = MWL8K_VIF(priv->vif)->bssid; | ||
| 3233 | |||
| 3234 | rc = mwl8k_cmd_set_post_scan(hw, bssid); | ||
| 3228 | } | 3235 | } |
| 3229 | } | 3236 | } |
| 3230 | 3237 | ||
| @@ -3726,6 +3733,8 @@ static void __devexit mwl8k_remove(struct pci_dev *pdev) | |||
| 3726 | 3733 | ||
| 3727 | ieee80211_stop_queues(hw); | 3734 | ieee80211_stop_queues(hw); |
| 3728 | 3735 | ||
| 3736 | ieee80211_unregister_hw(hw); | ||
| 3737 | |||
| 3729 | /* Remove tx reclaim tasklet */ | 3738 | /* Remove tx reclaim tasklet */ |
| 3730 | tasklet_kill(&priv->tx_reclaim_task); | 3739 | tasklet_kill(&priv->tx_reclaim_task); |
| 3731 | 3740 | ||
| @@ -3739,8 +3748,6 @@ static void __devexit mwl8k_remove(struct pci_dev *pdev) | |||
| 3739 | for (i = 0; i < MWL8K_TX_QUEUES; i++) | 3748 | for (i = 0; i < MWL8K_TX_QUEUES; i++) |
| 3740 | mwl8k_txq_reclaim(hw, i, 1); | 3749 | mwl8k_txq_reclaim(hw, i, 1); |
| 3741 | 3750 | ||
| 3742 | ieee80211_unregister_hw(hw); | ||
| 3743 | |||
| 3744 | for (i = 0; i < MWL8K_TX_QUEUES; i++) | 3751 | for (i = 0; i < MWL8K_TX_QUEUES; i++) |
| 3745 | mwl8k_txq_deinit(hw, i); | 3752 | mwl8k_txq_deinit(hw, i); |
| 3746 | 3753 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index a498dde024e1..49c9e2c1433d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
| @@ -849,13 +849,15 @@ struct rt2x00_dev { | |||
| 849 | static inline void rt2x00_rf_read(struct rt2x00_dev *rt2x00dev, | 849 | static inline void rt2x00_rf_read(struct rt2x00_dev *rt2x00dev, |
| 850 | const unsigned int word, u32 *data) | 850 | const unsigned int word, u32 *data) |
| 851 | { | 851 | { |
| 852 | *data = rt2x00dev->rf[word]; | 852 | BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32)); |
| 853 | *data = rt2x00dev->rf[word - 1]; | ||
| 853 | } | 854 | } |
| 854 | 855 | ||
| 855 | static inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev, | 856 | static inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev, |
| 856 | const unsigned int word, u32 data) | 857 | const unsigned int word, u32 data) |
| 857 | { | 858 | { |
| 858 | rt2x00dev->rf[word] = data; | 859 | BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32)); |
| 860 | rt2x00dev->rf[word - 1] = data; | ||
| 859 | } | 861 | } |
| 860 | 862 | ||
| 861 | /* | 863 | /* |
diff --git a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c index 37c84e3b8be0..81c753a617ab 100644 --- a/drivers/net/zorro8390.c +++ b/drivers/net/zorro8390.c | |||
| @@ -120,6 +120,9 @@ static int __devinit zorro8390_init_one(struct zorro_dev *z, | |||
| 120 | for (i = ARRAY_SIZE(cards)-1; i >= 0; i--) | 120 | for (i = ARRAY_SIZE(cards)-1; i >= 0; i--) |
| 121 | if (z->id == cards[i].id) | 121 | if (z->id == cards[i].id) |
| 122 | break; | 122 | break; |
| 123 | if (i < 0) | ||
| 124 | return -ENODEV; | ||
| 125 | |||
| 123 | board = z->resource.start; | 126 | board = z->resource.start; |
| 124 | ioaddr = board+cards[i].offset; | 127 | ioaddr = board+cards[i].offset; |
| 125 | dev = alloc_ei_netdev(); | 128 | dev = alloc_ei_netdev(); |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 037c1e0b7c4c..6553833c12db 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
| @@ -527,7 +527,7 @@ config SERIAL_S3C24A0 | |||
| 527 | 527 | ||
| 528 | config SERIAL_S3C6400 | 528 | config SERIAL_S3C6400 |
| 529 | tristate "Samsung S3C6400/S3C6410 Serial port support" | 529 | tristate "Samsung S3C6400/S3C6410 Serial port support" |
| 530 | depends on SERIAL_SAMSUNG && (CPU_S3C600 || CPU_S3C6410) | 530 | depends on SERIAL_SAMSUNG && (CPU_S3C6400 || CPU_S3C6410) |
| 531 | default y | 531 | default y |
| 532 | help | 532 | help |
| 533 | Serial port support for the Samsung S3C6400 and S3C6410 | 533 | Serial port support for the Samsung S3C6400 and S3C6410 |
diff --git a/drivers/spi/spi_s3c24xx.c b/drivers/spi/spi_s3c24xx.c index e0d44af4745a..3f3119d760db 100644 --- a/drivers/spi/spi_s3c24xx.c +++ b/drivers/spi/spi_s3c24xx.c | |||
| @@ -111,29 +111,32 @@ static int s3c24xx_spi_setupxfer(struct spi_device *spi, | |||
| 111 | unsigned int bpw; | 111 | unsigned int bpw; |
| 112 | unsigned int hz; | 112 | unsigned int hz; |
| 113 | unsigned int div; | 113 | unsigned int div; |
| 114 | unsigned long clk; | ||
| 114 | 115 | ||
| 115 | bpw = t ? t->bits_per_word : spi->bits_per_word; | 116 | bpw = t ? t->bits_per_word : spi->bits_per_word; |
| 116 | hz = t ? t->speed_hz : spi->max_speed_hz; | 117 | hz = t ? t->speed_hz : spi->max_speed_hz; |
| 117 | 118 | ||
| 119 | if (!bpw) | ||
| 120 | bpw = 8; | ||
| 121 | |||
| 122 | if (!hz) | ||
| 123 | hz = spi->max_speed_hz; | ||
| 124 | |||
| 118 | if (bpw != 8) { | 125 | if (bpw != 8) { |
| 119 | dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw); | 126 | dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw); |
| 120 | return -EINVAL; | 127 | return -EINVAL; |
| 121 | } | 128 | } |
| 122 | 129 | ||
| 123 | div = clk_get_rate(hw->clk) / hz; | 130 | clk = clk_get_rate(hw->clk); |
| 124 | 131 | div = DIV_ROUND_UP(clk, hz * 2) - 1; | |
| 125 | /* is clk = pclk / (2 * (pre+1)), or is it | ||
| 126 | * clk = (pclk * 2) / ( pre + 1) */ | ||
| 127 | |||
| 128 | div /= 2; | ||
| 129 | |||
| 130 | if (div > 0) | ||
| 131 | div -= 1; | ||
| 132 | 132 | ||
| 133 | if (div > 255) | 133 | if (div > 255) |
| 134 | div = 255; | 134 | div = 255; |
| 135 | 135 | ||
| 136 | dev_dbg(&spi->dev, "setting pre-scaler to %d (hz %d)\n", div, hz); | 136 | dev_dbg(&spi->dev, "setting pre-scaler to %d (wanted %d, got %ld)\n", |
| 137 | div, hz, clk / (2 * (div + 1))); | ||
| 138 | |||
| 139 | |||
| 137 | writeb(div, hw->regs + S3C2410_SPPRE); | 140 | writeb(div, hw->regs + S3C2410_SPPRE); |
| 138 | 141 | ||
| 139 | spin_lock(&hw->bitbang.lock); | 142 | spin_lock(&hw->bitbang.lock); |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index 8f24564f77b0..07f22b625632 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
| @@ -481,6 +481,9 @@ static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv) | |||
| 481 | /* tell the board code to enable the panel */ | 481 | /* tell the board code to enable the panel */ |
| 482 | for (k = 0; k < ARRAY_SIZE(priv->ch); k++) { | 482 | for (k = 0; k < ARRAY_SIZE(priv->ch); k++) { |
| 483 | ch = &priv->ch[k]; | 483 | ch = &priv->ch[k]; |
| 484 | if (!ch->enabled) | ||
| 485 | continue; | ||
| 486 | |||
| 484 | board_cfg = &ch->cfg.board_cfg; | 487 | board_cfg = &ch->cfg.board_cfg; |
| 485 | if (board_cfg->display_on) | 488 | if (board_cfg->display_on) |
| 486 | board_cfg->display_on(board_cfg->board_data); | 489 | board_cfg->display_on(board_cfg->board_data); |
| @@ -498,6 +501,8 @@ static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv) | |||
| 498 | /* clean up deferred io and ask board code to disable panel */ | 501 | /* clean up deferred io and ask board code to disable panel */ |
| 499 | for (k = 0; k < ARRAY_SIZE(priv->ch); k++) { | 502 | for (k = 0; k < ARRAY_SIZE(priv->ch); k++) { |
| 500 | ch = &priv->ch[k]; | 503 | ch = &priv->ch[k]; |
| 504 | if (!ch->enabled) | ||
| 505 | continue; | ||
| 501 | 506 | ||
| 502 | /* deferred io mode: | 507 | /* deferred io mode: |
| 503 | * flush frame, and wait for frame end interrupt | 508 | * flush frame, and wait for frame end interrupt |
