diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-09-22 15:43:14 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-22 15:43:14 -0400 |
commit | da192bb50cc9a7fe7d95e048422d51777bad0bba (patch) | |
tree | 560986cb68a747de281f82ca605c7125ccc65c1c | |
parent | af9288a707b609cdb1069cfe5bde0d6567c12c31 (diff) | |
parent | 3fd07d3bf0077dcc0f5a33d2eb1938ea050da8da (diff) |
Merge /spare/repo/linux-2.6/
-rw-r--r-- | Documentation/usb/URB.txt | 74 | ||||
-rw-r--r-- | MAINTAINERS | 2 | ||||
-rw-r--r-- | arch/ppc/syslib/ppc85xx_setup.c | 8 | ||||
-rw-r--r-- | drivers/base/class.c | 13 | ||||
-rw-r--r-- | drivers/base/dd.c | 3 | ||||
-rw-r--r-- | drivers/block/ub.c | 55 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 3 | ||||
-rw-r--r-- | drivers/net/r8169.c | 4 | ||||
-rw-r--r-- | drivers/net/skge.c | 194 | ||||
-rw-r--r-- | drivers/net/skge.h | 2 | ||||
-rw-r--r-- | drivers/pci/hotplug.c | 4 | ||||
-rw-r--r-- | drivers/pci/hotplug/rpadlpar_sysfs.c | 4 | ||||
-rw-r--r-- | drivers/pci/hotplug/sgi_hotplug.c | 6 | ||||
-rw-r--r-- | drivers/pci/pci-sysfs.c | 2 | ||||
-rw-r--r-- | drivers/pci/probe.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/ccwgroup.c | 2 | ||||
-rw-r--r-- | drivers/usb/core/message.c | 2 | ||||
-rw-r--r-- | drivers/usb/core/usb.c | 6 | ||||
-rw-r--r-- | drivers/usb/gadget/pxa2xx_udc.c | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/pxa2xx_udc.h | 8 | ||||
-rw-r--r-- | drivers/usb/host/sl811-hcd.c | 16 | ||||
-rw-r--r-- | drivers/usb/net/pegasus.c | 29 | ||||
-rw-r--r-- | drivers/usb/serial/airprime.c | 3 | ||||
-rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 8 | ||||
-rw-r--r-- | drivers/usb/serial/option.c | 11 | ||||
-rw-r--r-- | include/linux/device.h | 5 |
26 files changed, 252 insertions, 220 deletions
diff --git a/Documentation/usb/URB.txt b/Documentation/usb/URB.txt index d59b95cc6f1b..a49e5f2c2b46 100644 --- a/Documentation/usb/URB.txt +++ b/Documentation/usb/URB.txt | |||
@@ -1,5 +1,6 @@ | |||
1 | Revised: 2000-Dec-05. | 1 | Revised: 2000-Dec-05. |
2 | Again: 2002-Jul-06 | 2 | Again: 2002-Jul-06 |
3 | Again: 2005-Sep-19 | ||
3 | 4 | ||
4 | NOTE: | 5 | NOTE: |
5 | 6 | ||
@@ -18,8 +19,8 @@ called USB Request Block, or URB for short. | |||
18 | and deliver the data and status back. | 19 | and deliver the data and status back. |
19 | 20 | ||
20 | - Execution of an URB is inherently an asynchronous operation, i.e. the | 21 | - Execution of an URB is inherently an asynchronous operation, i.e. the |
21 | usb_submit_urb(urb) call returns immediately after it has successfully queued | 22 | usb_submit_urb(urb) call returns immediately after it has successfully |
22 | the requested action. | 23 | queued the requested action. |
23 | 24 | ||
24 | - Transfers for one URB can be canceled with usb_unlink_urb(urb) at any time. | 25 | - Transfers for one URB can be canceled with usb_unlink_urb(urb) at any time. |
25 | 26 | ||
@@ -94,8 +95,9 @@ To free an URB, use | |||
94 | 95 | ||
95 | void usb_free_urb(struct urb *urb) | 96 | void usb_free_urb(struct urb *urb) |
96 | 97 | ||
97 | You may not free an urb that you've submitted, but which hasn't yet been | 98 | You may free an urb that you've submitted, but which hasn't yet been |
98 | returned to you in a completion callback. | 99 | returned to you in a completion callback. It will automatically be |
100 | deallocated when it is no longer in use. | ||
99 | 101 | ||
100 | 102 | ||
101 | 1.4. What has to be filled in? | 103 | 1.4. What has to be filled in? |
@@ -145,30 +147,36 @@ to get seamless ISO streaming. | |||
145 | 147 | ||
146 | 1.6. How to cancel an already running URB? | 148 | 1.6. How to cancel an already running URB? |
147 | 149 | ||
148 | For an URB which you've submitted, but which hasn't been returned to | 150 | There are two ways to cancel an URB you've submitted but which hasn't |
149 | your driver by the host controller, call | 151 | been returned to your driver yet. For an asynchronous cancel, call |
150 | 152 | ||
151 | int usb_unlink_urb(struct urb *urb) | 153 | int usb_unlink_urb(struct urb *urb) |
152 | 154 | ||
153 | It removes the urb from the internal list and frees all allocated | 155 | It removes the urb from the internal list and frees all allocated |
154 | HW descriptors. The status is changed to reflect unlinking. After | 156 | HW descriptors. The status is changed to reflect unlinking. Note |
155 | usb_unlink_urb() returns with that status code, you can free the URB | 157 | that the URB will not normally have finished when usb_unlink_urb() |
156 | with usb_free_urb(). | 158 | returns; you must still wait for the completion handler to be called. |
157 | 159 | ||
158 | There is also an asynchronous unlink mode. To use this, set the | 160 | To cancel an URB synchronously, call |
159 | the URB_ASYNC_UNLINK flag in urb->transfer flags before calling | 161 | |
160 | usb_unlink_urb(). When using async unlinking, the URB will not | 162 | void usb_kill_urb(struct urb *urb) |
161 | normally be unlinked when usb_unlink_urb() returns. Instead, wait | 163 | |
162 | for the completion handler to be called. | 164 | It does everything usb_unlink_urb does, and in addition it waits |
165 | until after the URB has been returned and the completion handler | ||
166 | has finished. It also marks the URB as temporarily unusable, so | ||
167 | that if the completion handler or anyone else tries to resubmit it | ||
168 | they will get a -EPERM error. Thus you can be sure that when | ||
169 | usb_kill_urb() returns, the URB is totally idle. | ||
163 | 170 | ||
164 | 171 | ||
165 | 1.7. What about the completion handler? | 172 | 1.7. What about the completion handler? |
166 | 173 | ||
167 | The handler is of the following type: | 174 | The handler is of the following type: |
168 | 175 | ||
169 | typedef void (*usb_complete_t)(struct urb *); | 176 | typedef void (*usb_complete_t)(struct urb *, struct pt_regs *) |
170 | 177 | ||
171 | i.e. it gets just the URB that caused the completion call. | 178 | I.e., it gets the URB that caused the completion call, plus the |
179 | register values at the time of the corresponding interrupt (if any). | ||
172 | In the completion handler, you should have a look at urb->status to | 180 | In the completion handler, you should have a look at urb->status to |
173 | detect any USB errors. Since the context parameter is included in the URB, | 181 | detect any USB errors. Since the context parameter is included in the URB, |
174 | you can pass information to the completion handler. | 182 | you can pass information to the completion handler. |
@@ -176,17 +184,11 @@ you can pass information to the completion handler. | |||
176 | Note that even when an error (or unlink) is reported, data may have been | 184 | Note that even when an error (or unlink) is reported, data may have been |
177 | transferred. That's because USB transfers are packetized; it might take | 185 | transferred. That's because USB transfers are packetized; it might take |
178 | sixteen packets to transfer your 1KByte buffer, and ten of them might | 186 | sixteen packets to transfer your 1KByte buffer, and ten of them might |
179 | have transferred succesfully before the completion is called. | 187 | have transferred succesfully before the completion was called. |
180 | 188 | ||
181 | 189 | ||
182 | NOTE: ***** WARNING ***** | 190 | NOTE: ***** WARNING ***** |
183 | Don't use urb->dev field in your completion handler; it's cleared | 191 | NEVER SLEEP IN A COMPLETION HANDLER. These are normally called |
184 | as part of giving urbs back to drivers. (Addressing an issue with | ||
185 | ownership of periodic URBs, which was otherwise ambiguous.) Instead, | ||
186 | use urb->context to hold all the data your driver needs. | ||
187 | |||
188 | NOTE: ***** WARNING ***** | ||
189 | Also, NEVER SLEEP IN A COMPLETION HANDLER. These are normally called | ||
190 | during hardware interrupt processing. If you can, defer substantial | 192 | during hardware interrupt processing. If you can, defer substantial |
191 | work to a tasklet (bottom half) to keep system latencies low. You'll | 193 | work to a tasklet (bottom half) to keep system latencies low. You'll |
192 | probably need to use spinlocks to protect data structures you manipulate | 194 | probably need to use spinlocks to protect data structures you manipulate |
@@ -229,24 +231,10 @@ ISO data with some other event stream. | |||
229 | Interrupt transfers, like isochronous transfers, are periodic, and happen | 231 | Interrupt transfers, like isochronous transfers, are periodic, and happen |
230 | in intervals that are powers of two (1, 2, 4 etc) units. Units are frames | 232 | in intervals that are powers of two (1, 2, 4 etc) units. Units are frames |
231 | for full and low speed devices, and microframes for high speed ones. | 233 | for full and low speed devices, and microframes for high speed ones. |
232 | |||
233 | Currently, after you submit one interrupt URB, that urb is owned by the | ||
234 | host controller driver until you cancel it with usb_unlink_urb(). You | ||
235 | may unlink interrupt urbs in their completion handlers, if you need to. | ||
236 | |||
237 | After a transfer completion is called, the URB is automagically resubmitted. | ||
238 | THIS BEHAVIOR IS EXPECTED TO BE REMOVED!! | ||
239 | |||
240 | Interrupt transfers may only send (or receive) the "maxpacket" value for | ||
241 | the given interrupt endpoint; if you need more data, you will need to | ||
242 | copy that data out of (or into) another buffer. Similarly, you can't | ||
243 | queue interrupt transfers. | ||
244 | THESE RESTRICTIONS ARE EXPECTED TO BE REMOVED!! | ||
245 | |||
246 | Note that this automagic resubmission model does make it awkward to use | ||
247 | interrupt OUT transfers. The portable solution involves unlinking those | ||
248 | OUT urbs after the data is transferred, and perhaps submitting a final | ||
249 | URB for a short packet. | ||
250 | |||
251 | The usb_submit_urb() call modifies urb->interval to the implemented interval | 234 | The usb_submit_urb() call modifies urb->interval to the implemented interval |
252 | value that is less than or equal to the requested interval value. | 235 | value that is less than or equal to the requested interval value. |
236 | |||
237 | In Linux 2.6, unlike earlier versions, interrupt URBs are not automagically | ||
238 | restarted when they complete. They end when the completion handler is | ||
239 | called, just like other URBs. If you want an interrupt URB to be restarted, | ||
240 | your completion handler must resubmit it. | ||
diff --git a/MAINTAINERS b/MAINTAINERS index ade7415d2467..78aca12101a0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1063,8 +1063,6 @@ M: wli@holomorphy.com | |||
1063 | S: Maintained | 1063 | S: Maintained |
1064 | 1064 | ||
1065 | I2C SUBSYSTEM | 1065 | I2C SUBSYSTEM |
1066 | P: Greg Kroah-Hartman | ||
1067 | M: greg@kroah.com | ||
1068 | P: Jean Delvare | 1066 | P: Jean Delvare |
1069 | M: khali@linux-fr.org | 1067 | M: khali@linux-fr.org |
1070 | L: lm-sensors@lm-sensors.org | 1068 | L: lm-sensors@lm-sensors.org |
diff --git a/arch/ppc/syslib/ppc85xx_setup.c b/arch/ppc/syslib/ppc85xx_setup.c index b7242f1bd931..832b8bf99ae7 100644 --- a/arch/ppc/syslib/ppc85xx_setup.c +++ b/arch/ppc/syslib/ppc85xx_setup.c | |||
@@ -184,8 +184,8 @@ mpc85xx_setup_pci1(struct pci_controller *hose) | |||
184 | pci->powar1 = 0x80044000 | | 184 | pci->powar1 = 0x80044000 | |
185 | (__ilog2(MPC85XX_PCI1_UPPER_MEM - MPC85XX_PCI1_LOWER_MEM + 1) - 1); | 185 | (__ilog2(MPC85XX_PCI1_UPPER_MEM - MPC85XX_PCI1_LOWER_MEM + 1) - 1); |
186 | 186 | ||
187 | /* Setup outboud IO windows @ MPC85XX_PCI1_IO_BASE */ | 187 | /* Setup outbound IO windows @ MPC85XX_PCI1_IO_BASE */ |
188 | pci->potar2 = 0x00000000; | 188 | pci->potar2 = (MPC85XX_PCI1_LOWER_IO >> 12) & 0x000fffff; |
189 | pci->potear2 = 0x00000000; | 189 | pci->potear2 = 0x00000000; |
190 | pci->powbar2 = (MPC85XX_PCI1_IO_BASE >> 12) & 0x000fffff; | 190 | pci->powbar2 = (MPC85XX_PCI1_IO_BASE >> 12) & 0x000fffff; |
191 | /* Enable, IO R/W */ | 191 | /* Enable, IO R/W */ |
@@ -235,8 +235,8 @@ mpc85xx_setup_pci2(struct pci_controller *hose) | |||
235 | pci->powar1 = 0x80044000 | | 235 | pci->powar1 = 0x80044000 | |
236 | (__ilog2(MPC85XX_PCI2_UPPER_MEM - MPC85XX_PCI2_LOWER_MEM + 1) - 1); | 236 | (__ilog2(MPC85XX_PCI2_UPPER_MEM - MPC85XX_PCI2_LOWER_MEM + 1) - 1); |
237 | 237 | ||
238 | /* Setup outboud IO windows @ MPC85XX_PCI2_IO_BASE */ | 238 | /* Setup outbound IO windows @ MPC85XX_PCI2_IO_BASE */ |
239 | pci->potar2 = 0x00000000; | 239 | pci->potar2 = (MPC85XX_PCI2_LOWER_IO >> 12) & 0x000fffff;; |
240 | pci->potear2 = 0x00000000; | 240 | pci->potear2 = 0x00000000; |
241 | pci->powbar2 = (MPC85XX_PCI2_IO_BASE >> 12) & 0x000fffff; | 241 | pci->powbar2 = (MPC85XX_PCI2_IO_BASE >> 12) & 0x000fffff; |
242 | /* Enable, IO R/W */ | 242 | /* Enable, IO R/W */ |
diff --git a/drivers/base/class.c b/drivers/base/class.c index 3b112e3542f8..ce23dc8c18c5 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
@@ -669,6 +669,7 @@ void class_device_destroy(struct class *cls, dev_t devt) | |||
669 | int class_device_rename(struct class_device *class_dev, char *new_name) | 669 | int class_device_rename(struct class_device *class_dev, char *new_name) |
670 | { | 670 | { |
671 | int error = 0; | 671 | int error = 0; |
672 | char *old_class_name = NULL, *new_class_name = NULL; | ||
672 | 673 | ||
673 | class_dev = class_device_get(class_dev); | 674 | class_dev = class_device_get(class_dev); |
674 | if (!class_dev) | 675 | if (!class_dev) |
@@ -677,12 +678,24 @@ int class_device_rename(struct class_device *class_dev, char *new_name) | |||
677 | pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id, | 678 | pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id, |
678 | new_name); | 679 | new_name); |
679 | 680 | ||
681 | if (class_dev->dev) | ||
682 | old_class_name = make_class_name(class_dev); | ||
683 | |||
680 | strlcpy(class_dev->class_id, new_name, KOBJ_NAME_LEN); | 684 | strlcpy(class_dev->class_id, new_name, KOBJ_NAME_LEN); |
681 | 685 | ||
682 | error = kobject_rename(&class_dev->kobj, new_name); | 686 | error = kobject_rename(&class_dev->kobj, new_name); |
683 | 687 | ||
688 | if (class_dev->dev) { | ||
689 | new_class_name = make_class_name(class_dev); | ||
690 | sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, | ||
691 | new_class_name); | ||
692 | sysfs_remove_link(&class_dev->dev->kobj, old_class_name); | ||
693 | } | ||
684 | class_device_put(class_dev); | 694 | class_device_put(class_dev); |
685 | 695 | ||
696 | kfree(old_class_name); | ||
697 | kfree(new_class_name); | ||
698 | |||
686 | return error; | 699 | return error; |
687 | } | 700 | } |
688 | 701 | ||
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index d5bbce38282f..3565e9795301 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -40,6 +40,9 @@ | |||
40 | */ | 40 | */ |
41 | void device_bind_driver(struct device * dev) | 41 | void device_bind_driver(struct device * dev) |
42 | { | 42 | { |
43 | if (klist_node_attached(&dev->knode_driver)) | ||
44 | return; | ||
45 | |||
43 | pr_debug("bound device '%s' to driver '%s'\n", | 46 | pr_debug("bound device '%s' to driver '%s'\n", |
44 | dev->bus_id, dev->driver->name); | 47 | dev->bus_id, dev->driver->name); |
45 | klist_add_tail(&dev->knode_driver, &dev->driver->klist_devices); | 48 | klist_add_tail(&dev->knode_driver, &dev->driver->klist_devices); |
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index aa0bf7ee008d..ed4d5006fe62 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -172,7 +172,7 @@ struct bulk_cs_wrap { | |||
172 | */ | 172 | */ |
173 | struct ub_dev; | 173 | struct ub_dev; |
174 | 174 | ||
175 | #define UB_MAX_REQ_SG 4 | 175 | #define UB_MAX_REQ_SG 9 /* cdrecord requires 32KB and maybe a header */ |
176 | #define UB_MAX_SECTORS 64 | 176 | #define UB_MAX_SECTORS 64 |
177 | 177 | ||
178 | /* | 178 | /* |
@@ -387,7 +387,7 @@ struct ub_dev { | |||
387 | struct bulk_cs_wrap work_bcs; | 387 | struct bulk_cs_wrap work_bcs; |
388 | struct usb_ctrlrequest work_cr; | 388 | struct usb_ctrlrequest work_cr; |
389 | 389 | ||
390 | int sg_stat[UB_MAX_REQ_SG+1]; | 390 | int sg_stat[6]; |
391 | struct ub_scsi_trace tr; | 391 | struct ub_scsi_trace tr; |
392 | }; | 392 | }; |
393 | 393 | ||
@@ -525,12 +525,13 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, | |||
525 | "qlen %d qmax %d\n", | 525 | "qlen %d qmax %d\n", |
526 | sc->cmd_queue.qlen, sc->cmd_queue.qmax); | 526 | sc->cmd_queue.qlen, sc->cmd_queue.qmax); |
527 | cnt += sprintf(page + cnt, | 527 | cnt += sprintf(page + cnt, |
528 | "sg %d %d %d %d %d\n", | 528 | "sg %d %d %d %d %d .. %d\n", |
529 | sc->sg_stat[0], | 529 | sc->sg_stat[0], |
530 | sc->sg_stat[1], | 530 | sc->sg_stat[1], |
531 | sc->sg_stat[2], | 531 | sc->sg_stat[2], |
532 | sc->sg_stat[3], | 532 | sc->sg_stat[3], |
533 | sc->sg_stat[4]); | 533 | sc->sg_stat[4], |
534 | sc->sg_stat[5]); | ||
534 | 535 | ||
535 | list_for_each (p, &sc->luns) { | 536 | list_for_each (p, &sc->luns) { |
536 | lun = list_entry(p, struct ub_lun, link); | 537 | lun = list_entry(p, struct ub_lun, link); |
@@ -835,7 +836,7 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
835 | return -1; | 836 | return -1; |
836 | } | 837 | } |
837 | cmd->nsg = n_elem; | 838 | cmd->nsg = n_elem; |
838 | sc->sg_stat[n_elem]++; | 839 | sc->sg_stat[n_elem < 5 ? n_elem : 5]++; |
839 | 840 | ||
840 | /* | 841 | /* |
841 | * build the command | 842 | * build the command |
@@ -891,7 +892,7 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | |||
891 | return -1; | 892 | return -1; |
892 | } | 893 | } |
893 | cmd->nsg = n_elem; | 894 | cmd->nsg = n_elem; |
894 | sc->sg_stat[n_elem]++; | 895 | sc->sg_stat[n_elem < 5 ? n_elem : 5]++; |
895 | 896 | ||
896 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | 897 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); |
897 | cmd->cdb_len = rq->cmd_len; | 898 | cmd->cdb_len = rq->cmd_len; |
@@ -1010,7 +1011,6 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1010 | sc->last_pipe = sc->send_bulk_pipe; | 1011 | sc->last_pipe = sc->send_bulk_pipe; |
1011 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, | 1012 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, |
1012 | bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); | 1013 | bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); |
1013 | sc->work_urb.transfer_flags = 0; | ||
1014 | 1014 | ||
1015 | /* Fill what we shouldn't be filling, because usb-storage did so. */ | 1015 | /* Fill what we shouldn't be filling, because usb-storage did so. */ |
1016 | sc->work_urb.actual_length = 0; | 1016 | sc->work_urb.actual_length = 0; |
@@ -1019,7 +1019,6 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1019 | 1019 | ||
1020 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | 1020 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { |
1021 | /* XXX Clear stalls */ | 1021 | /* XXX Clear stalls */ |
1022 | printk("ub: cmd #%d start failed (%d)\n", cmd->tag, rc); /* P3 */ | ||
1023 | ub_complete(&sc->work_done); | 1022 | ub_complete(&sc->work_done); |
1024 | return rc; | 1023 | return rc; |
1025 | } | 1024 | } |
@@ -1190,11 +1189,9 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1190 | return; | 1189 | return; |
1191 | } | 1190 | } |
1192 | if (urb->status != 0) { | 1191 | if (urb->status != 0) { |
1193 | printk("ub: cmd #%d cmd status (%d)\n", cmd->tag, urb->status); /* P3 */ | ||
1194 | goto Bad_End; | 1192 | goto Bad_End; |
1195 | } | 1193 | } |
1196 | if (urb->actual_length != US_BULK_CB_WRAP_LEN) { | 1194 | if (urb->actual_length != US_BULK_CB_WRAP_LEN) { |
1197 | printk("ub: cmd #%d xferred %d\n", cmd->tag, urb->actual_length); /* P3 */ | ||
1198 | /* XXX Must do reset here to unconfuse the device */ | 1195 | /* XXX Must do reset here to unconfuse the device */ |
1199 | goto Bad_End; | 1196 | goto Bad_End; |
1200 | } | 1197 | } |
@@ -1395,14 +1392,12 @@ static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1395 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | 1392 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, |
1396 | page_address(sg->page) + sg->offset, sg->length, | 1393 | page_address(sg->page) + sg->offset, sg->length, |
1397 | ub_urb_complete, sc); | 1394 | ub_urb_complete, sc); |
1398 | sc->work_urb.transfer_flags = 0; | ||
1399 | sc->work_urb.actual_length = 0; | 1395 | sc->work_urb.actual_length = 0; |
1400 | sc->work_urb.error_count = 0; | 1396 | sc->work_urb.error_count = 0; |
1401 | sc->work_urb.status = 0; | 1397 | sc->work_urb.status = 0; |
1402 | 1398 | ||
1403 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | 1399 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { |
1404 | /* XXX Clear stalls */ | 1400 | /* XXX Clear stalls */ |
1405 | printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */ | ||
1406 | ub_complete(&sc->work_done); | 1401 | ub_complete(&sc->work_done); |
1407 | ub_state_done(sc, cmd, rc); | 1402 | ub_state_done(sc, cmd, rc); |
1408 | return; | 1403 | return; |
@@ -1442,7 +1437,6 @@ static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1442 | sc->last_pipe = sc->recv_bulk_pipe; | 1437 | sc->last_pipe = sc->recv_bulk_pipe; |
1443 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, | 1438 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, |
1444 | &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); | 1439 | &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); |
1445 | sc->work_urb.transfer_flags = 0; | ||
1446 | sc->work_urb.actual_length = 0; | 1440 | sc->work_urb.actual_length = 0; |
1447 | sc->work_urb.error_count = 0; | 1441 | sc->work_urb.error_count = 0; |
1448 | sc->work_urb.status = 0; | 1442 | sc->work_urb.status = 0; |
@@ -1563,7 +1557,6 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | |||
1563 | 1557 | ||
1564 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, | 1558 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, |
1565 | (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); | 1559 | (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); |
1566 | sc->work_urb.transfer_flags = 0; | ||
1567 | sc->work_urb.actual_length = 0; | 1560 | sc->work_urb.actual_length = 0; |
1568 | sc->work_urb.error_count = 0; | 1561 | sc->work_urb.error_count = 0; |
1569 | sc->work_urb.status = 0; | 1562 | sc->work_urb.status = 0; |
@@ -2000,17 +1993,16 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2000 | 1993 | ||
2001 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->recv_ctrl_pipe, | 1994 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->recv_ctrl_pipe, |
2002 | (unsigned char*) cr, p, 1, ub_probe_urb_complete, &compl); | 1995 | (unsigned char*) cr, p, 1, ub_probe_urb_complete, &compl); |
2003 | sc->work_urb.transfer_flags = 0; | ||
2004 | sc->work_urb.actual_length = 0; | 1996 | sc->work_urb.actual_length = 0; |
2005 | sc->work_urb.error_count = 0; | 1997 | sc->work_urb.error_count = 0; |
2006 | sc->work_urb.status = 0; | 1998 | sc->work_urb.status = 0; |
2007 | 1999 | ||
2008 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) { | 2000 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) { |
2009 | if (rc == -EPIPE) { | 2001 | if (rc == -EPIPE) { |
2010 | printk("%s: Stall at GetMaxLUN, using 1 LUN\n", | 2002 | printk("%s: Stall submitting GetMaxLUN, using 1 LUN\n", |
2011 | sc->name); /* P3 */ | 2003 | sc->name); /* P3 */ |
2012 | } else { | 2004 | } else { |
2013 | printk(KERN_WARNING | 2005 | printk(KERN_NOTICE |
2014 | "%s: Unable to submit GetMaxLUN (%d)\n", | 2006 | "%s: Unable to submit GetMaxLUN (%d)\n", |
2015 | sc->name, rc); | 2007 | sc->name, rc); |
2016 | } | 2008 | } |
@@ -2028,6 +2020,18 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2028 | del_timer_sync(&timer); | 2020 | del_timer_sync(&timer); |
2029 | usb_kill_urb(&sc->work_urb); | 2021 | usb_kill_urb(&sc->work_urb); |
2030 | 2022 | ||
2023 | if ((rc = sc->work_urb.status) < 0) { | ||
2024 | if (rc == -EPIPE) { | ||
2025 | printk("%s: Stall at GetMaxLUN, using 1 LUN\n", | ||
2026 | sc->name); /* P3 */ | ||
2027 | } else { | ||
2028 | printk(KERN_NOTICE | ||
2029 | "%s: Error at GetMaxLUN (%d)\n", | ||
2030 | sc->name, rc); | ||
2031 | } | ||
2032 | goto err_io; | ||
2033 | } | ||
2034 | |||
2031 | if (sc->work_urb.actual_length != 1) { | 2035 | if (sc->work_urb.actual_length != 1) { |
2032 | printk("%s: GetMaxLUN returned %d bytes\n", sc->name, | 2036 | printk("%s: GetMaxLUN returned %d bytes\n", sc->name, |
2033 | sc->work_urb.actual_length); /* P3 */ | 2037 | sc->work_urb.actual_length); /* P3 */ |
@@ -2048,6 +2052,7 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2048 | kfree(p); | 2052 | kfree(p); |
2049 | return nluns; | 2053 | return nluns; |
2050 | 2054 | ||
2055 | err_io: | ||
2051 | err_submit: | 2056 | err_submit: |
2052 | kfree(p); | 2057 | kfree(p); |
2053 | err_alloc: | 2058 | err_alloc: |
@@ -2080,7 +2085,6 @@ static int ub_probe_clear_stall(struct ub_dev *sc, int stalled_pipe) | |||
2080 | 2085 | ||
2081 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, | 2086 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, |
2082 | (unsigned char*) cr, NULL, 0, ub_probe_urb_complete, &compl); | 2087 | (unsigned char*) cr, NULL, 0, ub_probe_urb_complete, &compl); |
2083 | sc->work_urb.transfer_flags = 0; | ||
2084 | sc->work_urb.actual_length = 0; | 2088 | sc->work_urb.actual_length = 0; |
2085 | sc->work_urb.error_count = 0; | 2089 | sc->work_urb.error_count = 0; |
2086 | sc->work_urb.status = 0; | 2090 | sc->work_urb.status = 0; |
@@ -2213,8 +2217,10 @@ static int ub_probe(struct usb_interface *intf, | |||
2213 | * This is needed to clear toggles. It is a problem only if we do | 2217 | * This is needed to clear toggles. It is a problem only if we do |
2214 | * `rmmod ub && modprobe ub` without disconnects, but we like that. | 2218 | * `rmmod ub && modprobe ub` without disconnects, but we like that. |
2215 | */ | 2219 | */ |
2220 | #if 0 /* iPod Mini fails if we do this (big white iPod works) */ | ||
2216 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); | 2221 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); |
2217 | ub_probe_clear_stall(sc, sc->send_bulk_pipe); | 2222 | ub_probe_clear_stall(sc, sc->send_bulk_pipe); |
2223 | #endif | ||
2218 | 2224 | ||
2219 | /* | 2225 | /* |
2220 | * The way this is used by the startup code is a little specific. | 2226 | * The way this is used by the startup code is a little specific. |
@@ -2241,10 +2247,10 @@ static int ub_probe(struct usb_interface *intf, | |||
2241 | for (i = 0; i < 3; i++) { | 2247 | for (i = 0; i < 3; i++) { |
2242 | if ((rc = ub_sync_getmaxlun(sc)) < 0) { | 2248 | if ((rc = ub_sync_getmaxlun(sc)) < 0) { |
2243 | /* | 2249 | /* |
2244 | * Some devices (i.e. Iomega Zip100) need this -- | 2250 | * This segment is taken from usb-storage. They say |
2245 | * apparently the bulk pipes get STALLed when the | 2251 | * that ZIP-100 needs this, but my own ZIP-100 works |
2246 | * GetMaxLUN request is processed. | 2252 | * fine without this. |
2247 | * XXX I have a ZIP-100, verify it does this. | 2253 | * Still, it does not seem to hurt anything. |
2248 | */ | 2254 | */ |
2249 | if (rc == -EPIPE) { | 2255 | if (rc == -EPIPE) { |
2250 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); | 2256 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); |
@@ -2313,7 +2319,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum) | |||
2313 | disk->first_minor = lun->id * UB_MINORS_PER_MAJOR; | 2319 | disk->first_minor = lun->id * UB_MINORS_PER_MAJOR; |
2314 | disk->fops = &ub_bd_fops; | 2320 | disk->fops = &ub_bd_fops; |
2315 | disk->private_data = lun; | 2321 | disk->private_data = lun; |
2316 | disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */ | 2322 | disk->driverfs_dev = &sc->intf->dev; |
2317 | 2323 | ||
2318 | rc = -ENOMEM; | 2324 | rc = -ENOMEM; |
2319 | if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL) | 2325 | if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL) |
@@ -2466,9 +2472,6 @@ static int __init ub_init(void) | |||
2466 | { | 2472 | { |
2467 | int rc; | 2473 | int rc; |
2468 | 2474 | ||
2469 | /* P3 */ printk("ub: sizeof ub_scsi_cmd %zu ub_dev %zu ub_lun %zu\n", | ||
2470 | sizeof(struct ub_scsi_cmd), sizeof(struct ub_dev), sizeof(struct ub_lun)); | ||
2471 | |||
2472 | if ((rc = register_blkdev(UB_MAJOR, DRV_NAME)) != 0) | 2475 | if ((rc = register_blkdev(UB_MAJOR, DRV_NAME)) != 0) |
2473 | goto err_regblkdev; | 2476 | goto err_regblkdev; |
2474 | devfs_mk_dir(DEVFS_NAME); | 2477 | devfs_mk_dir(DEVFS_NAME); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 90449a0f2a6c..6d00c3de1a83 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1653,7 +1653,8 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de | |||
1653 | int old_features = bond_dev->features; | 1653 | int old_features = bond_dev->features; |
1654 | int res = 0; | 1654 | int res = 0; |
1655 | 1655 | ||
1656 | if (slave_dev->do_ioctl == NULL) { | 1656 | if (!bond->params.use_carrier && slave_dev->ethtool_ops == NULL && |
1657 | slave_dev->do_ioctl == NULL) { | ||
1657 | printk(KERN_WARNING DRV_NAME | 1658 | printk(KERN_WARNING DRV_NAME |
1658 | ": Warning : no link monitoring support for %s\n", | 1659 | ": Warning : no link monitoring support for %s\n", |
1659 | slave_dev->name); | 1660 | slave_dev->name); |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index cbc60ce365cb..40c40eba2581 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -100,11 +100,11 @@ VERSION 2.2LK <2005/01/25> | |||
100 | 100 | ||
101 | #ifdef CONFIG_R8169_NAPI | 101 | #ifdef CONFIG_R8169_NAPI |
102 | #define rtl8169_rx_skb netif_receive_skb | 102 | #define rtl8169_rx_skb netif_receive_skb |
103 | #define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx | 103 | #define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb |
104 | #define rtl8169_rx_quota(count, quota) min(count, quota) | 104 | #define rtl8169_rx_quota(count, quota) min(count, quota) |
105 | #else | 105 | #else |
106 | #define rtl8169_rx_skb netif_rx | 106 | #define rtl8169_rx_skb netif_rx |
107 | #define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb | 107 | #define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx |
108 | #define rtl8169_rx_quota(count, quota) count | 108 | #define rtl8169_rx_quota(count, quota) count |
109 | #endif | 109 | #endif |
110 | 110 | ||
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 7ce734ec6ba8..189203c95330 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -42,7 +42,7 @@ | |||
42 | #include "skge.h" | 42 | #include "skge.h" |
43 | 43 | ||
44 | #define DRV_NAME "skge" | 44 | #define DRV_NAME "skge" |
45 | #define DRV_VERSION "1.0" | 45 | #define DRV_VERSION "1.1" |
46 | #define PFX DRV_NAME " " | 46 | #define PFX DRV_NAME " " |
47 | 47 | ||
48 | #define DEFAULT_TX_RING_SIZE 128 | 48 | #define DEFAULT_TX_RING_SIZE 128 |
@@ -105,41 +105,28 @@ static const u32 rxirqmask[] = { IS_R1_F, IS_R2_F }; | |||
105 | static const u32 txirqmask[] = { IS_XA1_F, IS_XA2_F }; | 105 | static const u32 txirqmask[] = { IS_XA1_F, IS_XA2_F }; |
106 | static const u32 portirqmask[] = { IS_PORT_1, IS_PORT_2 }; | 106 | static const u32 portirqmask[] = { IS_PORT_1, IS_PORT_2 }; |
107 | 107 | ||
108 | /* Don't need to look at whole 16K. | ||
109 | * last interesting register is descriptor poll timer. | ||
110 | */ | ||
111 | #define SKGE_REGS_LEN (29*128) | ||
112 | |||
113 | static int skge_get_regs_len(struct net_device *dev) | 108 | static int skge_get_regs_len(struct net_device *dev) |
114 | { | 109 | { |
115 | return SKGE_REGS_LEN; | 110 | return 0x4000; |
116 | } | 111 | } |
117 | 112 | ||
118 | /* | 113 | /* |
119 | * Returns copy of control register region | 114 | * Returns copy of whole control register region |
120 | * I/O region is divided into banks and certain regions are unreadable | 115 | * Note: skip RAM address register because accessing it will |
116 | * cause bus hangs! | ||
121 | */ | 117 | */ |
122 | static void skge_get_regs(struct net_device *dev, struct ethtool_regs *regs, | 118 | static void skge_get_regs(struct net_device *dev, struct ethtool_regs *regs, |
123 | void *p) | 119 | void *p) |
124 | { | 120 | { |
125 | const struct skge_port *skge = netdev_priv(dev); | 121 | const struct skge_port *skge = netdev_priv(dev); |
126 | unsigned long offs; | ||
127 | const void __iomem *io = skge->hw->regs; | 122 | const void __iomem *io = skge->hw->regs; |
128 | static const unsigned long bankmap | ||
129 | = (1<<0) | (1<<2) | (1<<8) | (1<<9) | ||
130 | | (1<<12) | (1<<13) | (1<<14) | (1<<15) | (1<<16) | ||
131 | | (1<<17) | (1<<20) | (1<<21) | (1<<22) | (1<<23) | ||
132 | | (1<<24) | (1<<25) | (1<<26) | (1<<27) | (1<<28); | ||
133 | 123 | ||
134 | regs->version = 1; | 124 | regs->version = 1; |
135 | for (offs = 0; offs < regs->len; offs += 128) { | 125 | memset(p, 0, regs->len); |
136 | u32 len = min_t(u32, 128, regs->len - offs); | 126 | memcpy_fromio(p, io, B3_RAM_ADDR); |
137 | 127 | ||
138 | if (bankmap & (1<<(offs/128))) | 128 | memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1, |
139 | memcpy_fromio(p + offs, io + offs, len); | 129 | regs->len - B3_RI_WTO_R1); |
140 | else | ||
141 | memset(p + offs, 0, len); | ||
142 | } | ||
143 | } | 130 | } |
144 | 131 | ||
145 | /* Wake on Lan only supported on Yukon chps with rev 1 or above */ | 132 | /* Wake on Lan only supported on Yukon chps with rev 1 or above */ |
@@ -776,17 +763,6 @@ static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u64 base) | |||
776 | return 0; | 763 | return 0; |
777 | } | 764 | } |
778 | 765 | ||
779 | static struct sk_buff *skge_rx_alloc(struct net_device *dev, unsigned int size) | ||
780 | { | ||
781 | struct sk_buff *skb = dev_alloc_skb(size); | ||
782 | |||
783 | if (likely(skb)) { | ||
784 | skb->dev = dev; | ||
785 | skb_reserve(skb, NET_IP_ALIGN); | ||
786 | } | ||
787 | return skb; | ||
788 | } | ||
789 | |||
790 | /* Allocate and setup a new buffer for receiving */ | 766 | /* Allocate and setup a new buffer for receiving */ |
791 | static void skge_rx_setup(struct skge_port *skge, struct skge_element *e, | 767 | static void skge_rx_setup(struct skge_port *skge, struct skge_element *e, |
792 | struct sk_buff *skb, unsigned int bufsize) | 768 | struct sk_buff *skb, unsigned int bufsize) |
@@ -859,16 +835,17 @@ static int skge_rx_fill(struct skge_port *skge) | |||
859 | { | 835 | { |
860 | struct skge_ring *ring = &skge->rx_ring; | 836 | struct skge_ring *ring = &skge->rx_ring; |
861 | struct skge_element *e; | 837 | struct skge_element *e; |
862 | unsigned int bufsize = skge->rx_buf_size; | ||
863 | 838 | ||
864 | e = ring->start; | 839 | e = ring->start; |
865 | do { | 840 | do { |
866 | struct sk_buff *skb = skge_rx_alloc(skge->netdev, bufsize); | 841 | struct sk_buff *skb; |
867 | 842 | ||
843 | skb = dev_alloc_skb(skge->rx_buf_size + NET_IP_ALIGN); | ||
868 | if (!skb) | 844 | if (!skb) |
869 | return -ENOMEM; | 845 | return -ENOMEM; |
870 | 846 | ||
871 | skge_rx_setup(skge, e, skb, bufsize); | 847 | skb_reserve(skb, NET_IP_ALIGN); |
848 | skge_rx_setup(skge, e, skb, skge->rx_buf_size); | ||
872 | } while ( (e = e->next) != ring->start); | 849 | } while ( (e = e->next) != ring->start); |
873 | 850 | ||
874 | ring->to_clean = ring->start; | 851 | ring->to_clean = ring->start; |
@@ -2443,6 +2420,14 @@ static void yukon_set_multicast(struct net_device *dev) | |||
2443 | gma_write16(hw, port, GM_RX_CTRL, reg); | 2420 | gma_write16(hw, port, GM_RX_CTRL, reg); |
2444 | } | 2421 | } |
2445 | 2422 | ||
2423 | static inline u16 phy_length(const struct skge_hw *hw, u32 status) | ||
2424 | { | ||
2425 | if (hw->chip_id == CHIP_ID_GENESIS) | ||
2426 | return status >> XMR_FS_LEN_SHIFT; | ||
2427 | else | ||
2428 | return status >> GMR_FS_LEN_SHIFT; | ||
2429 | } | ||
2430 | |||
2446 | static inline int bad_phy_status(const struct skge_hw *hw, u32 status) | 2431 | static inline int bad_phy_status(const struct skge_hw *hw, u32 status) |
2447 | { | 2432 | { |
2448 | if (hw->chip_id == CHIP_ID_GENESIS) | 2433 | if (hw->chip_id == CHIP_ID_GENESIS) |
@@ -2452,80 +2437,99 @@ static inline int bad_phy_status(const struct skge_hw *hw, u32 status) | |||
2452 | (status & GMR_FS_RX_OK) == 0; | 2437 | (status & GMR_FS_RX_OK) == 0; |
2453 | } | 2438 | } |
2454 | 2439 | ||
2455 | static void skge_rx_error(struct skge_port *skge, int slot, | ||
2456 | u32 control, u32 status) | ||
2457 | { | ||
2458 | if (netif_msg_rx_err(skge)) | ||
2459 | printk(KERN_DEBUG PFX "%s: rx err, slot %d control 0x%x status 0x%x\n", | ||
2460 | skge->netdev->name, slot, control, status); | ||
2461 | |||
2462 | if ((control & (BMU_EOF|BMU_STF)) != (BMU_STF|BMU_EOF)) | ||
2463 | skge->net_stats.rx_length_errors++; | ||
2464 | else if (skge->hw->chip_id == CHIP_ID_GENESIS) { | ||
2465 | if (status & (XMR_FS_RUNT|XMR_FS_LNG_ERR)) | ||
2466 | skge->net_stats.rx_length_errors++; | ||
2467 | if (status & XMR_FS_FRA_ERR) | ||
2468 | skge->net_stats.rx_frame_errors++; | ||
2469 | if (status & XMR_FS_FCS_ERR) | ||
2470 | skge->net_stats.rx_crc_errors++; | ||
2471 | } else { | ||
2472 | if (status & (GMR_FS_LONG_ERR|GMR_FS_UN_SIZE)) | ||
2473 | skge->net_stats.rx_length_errors++; | ||
2474 | if (status & GMR_FS_FRAGMENT) | ||
2475 | skge->net_stats.rx_frame_errors++; | ||
2476 | if (status & GMR_FS_CRC_ERR) | ||
2477 | skge->net_stats.rx_crc_errors++; | ||
2478 | } | ||
2479 | } | ||
2480 | 2440 | ||
2481 | /* Get receive buffer from descriptor. | 2441 | /* Get receive buffer from descriptor. |
2482 | * Handles copy of small buffers and reallocation failures | 2442 | * Handles copy of small buffers and reallocation failures |
2483 | */ | 2443 | */ |
2484 | static inline struct sk_buff *skge_rx_get(struct skge_port *skge, | 2444 | static inline struct sk_buff *skge_rx_get(struct skge_port *skge, |
2485 | struct skge_element *e, | 2445 | struct skge_element *e, |
2486 | unsigned int len) | 2446 | u32 control, u32 status, u16 csum) |
2487 | { | 2447 | { |
2488 | struct sk_buff *nskb, *skb; | 2448 | struct sk_buff *skb; |
2449 | u16 len = control & BMU_BBC; | ||
2450 | |||
2451 | if (unlikely(netif_msg_rx_status(skge))) | ||
2452 | printk(KERN_DEBUG PFX "%s: rx slot %td status 0x%x len %d\n", | ||
2453 | skge->netdev->name, e - skge->rx_ring.start, | ||
2454 | status, len); | ||
2455 | |||
2456 | if (len > skge->rx_buf_size) | ||
2457 | goto error; | ||
2458 | |||
2459 | if ((control & (BMU_EOF|BMU_STF)) != (BMU_STF|BMU_EOF)) | ||
2460 | goto error; | ||
2461 | |||
2462 | if (bad_phy_status(skge->hw, status)) | ||
2463 | goto error; | ||
2464 | |||
2465 | if (phy_length(skge->hw, status) != len) | ||
2466 | goto error; | ||
2489 | 2467 | ||
2490 | if (len < RX_COPY_THRESHOLD) { | 2468 | if (len < RX_COPY_THRESHOLD) { |
2491 | nskb = skge_rx_alloc(skge->netdev, len + NET_IP_ALIGN); | 2469 | skb = dev_alloc_skb(len + 2); |
2492 | if (unlikely(!nskb)) | 2470 | if (!skb) |
2493 | return NULL; | 2471 | goto resubmit; |
2494 | 2472 | ||
2473 | skb_reserve(skb, 2); | ||
2495 | pci_dma_sync_single_for_cpu(skge->hw->pdev, | 2474 | pci_dma_sync_single_for_cpu(skge->hw->pdev, |
2496 | pci_unmap_addr(e, mapaddr), | 2475 | pci_unmap_addr(e, mapaddr), |
2497 | len, PCI_DMA_FROMDEVICE); | 2476 | len, PCI_DMA_FROMDEVICE); |
2498 | memcpy(nskb->data, e->skb->data, len); | 2477 | memcpy(skb->data, e->skb->data, len); |
2499 | pci_dma_sync_single_for_device(skge->hw->pdev, | 2478 | pci_dma_sync_single_for_device(skge->hw->pdev, |
2500 | pci_unmap_addr(e, mapaddr), | 2479 | pci_unmap_addr(e, mapaddr), |
2501 | len, PCI_DMA_FROMDEVICE); | 2480 | len, PCI_DMA_FROMDEVICE); |
2502 | |||
2503 | if (skge->rx_csum) { | ||
2504 | struct skge_rx_desc *rd = e->desc; | ||
2505 | nskb->csum = le16_to_cpu(rd->csum2); | ||
2506 | nskb->ip_summed = CHECKSUM_HW; | ||
2507 | } | ||
2508 | skge_rx_reuse(e, skge->rx_buf_size); | 2481 | skge_rx_reuse(e, skge->rx_buf_size); |
2509 | return nskb; | ||
2510 | } else { | 2482 | } else { |
2511 | nskb = skge_rx_alloc(skge->netdev, skge->rx_buf_size); | 2483 | struct sk_buff *nskb; |
2512 | if (unlikely(!nskb)) | 2484 | nskb = dev_alloc_skb(skge->rx_buf_size + NET_IP_ALIGN); |
2513 | return NULL; | 2485 | if (!nskb) |
2486 | goto resubmit; | ||
2514 | 2487 | ||
2515 | pci_unmap_single(skge->hw->pdev, | 2488 | pci_unmap_single(skge->hw->pdev, |
2516 | pci_unmap_addr(e, mapaddr), | 2489 | pci_unmap_addr(e, mapaddr), |
2517 | pci_unmap_len(e, maplen), | 2490 | pci_unmap_len(e, maplen), |
2518 | PCI_DMA_FROMDEVICE); | 2491 | PCI_DMA_FROMDEVICE); |
2519 | skb = e->skb; | 2492 | skb = e->skb; |
2520 | if (skge->rx_csum) { | 2493 | prefetch(skb->data); |
2521 | struct skge_rx_desc *rd = e->desc; | ||
2522 | skb->csum = le16_to_cpu(rd->csum2); | ||
2523 | skb->ip_summed = CHECKSUM_HW; | ||
2524 | } | ||
2525 | |||
2526 | skge_rx_setup(skge, e, nskb, skge->rx_buf_size); | 2494 | skge_rx_setup(skge, e, nskb, skge->rx_buf_size); |
2527 | return skb; | ||
2528 | } | 2495 | } |
2496 | |||
2497 | skb_put(skb, len); | ||
2498 | skb->dev = skge->netdev; | ||
2499 | if (skge->rx_csum) { | ||
2500 | skb->csum = csum; | ||
2501 | skb->ip_summed = CHECKSUM_HW; | ||
2502 | } | ||
2503 | |||
2504 | skb->protocol = eth_type_trans(skb, skge->netdev); | ||
2505 | |||
2506 | return skb; | ||
2507 | error: | ||
2508 | |||
2509 | if (netif_msg_rx_err(skge)) | ||
2510 | printk(KERN_DEBUG PFX "%s: rx err, slot %td control 0x%x status 0x%x\n", | ||
2511 | skge->netdev->name, e - skge->rx_ring.start, | ||
2512 | control, status); | ||
2513 | |||
2514 | if (skge->hw->chip_id == CHIP_ID_GENESIS) { | ||
2515 | if (status & (XMR_FS_RUNT|XMR_FS_LNG_ERR)) | ||
2516 | skge->net_stats.rx_length_errors++; | ||
2517 | if (status & XMR_FS_FRA_ERR) | ||
2518 | skge->net_stats.rx_frame_errors++; | ||
2519 | if (status & XMR_FS_FCS_ERR) | ||
2520 | skge->net_stats.rx_crc_errors++; | ||
2521 | } else { | ||
2522 | if (status & (GMR_FS_LONG_ERR|GMR_FS_UN_SIZE)) | ||
2523 | skge->net_stats.rx_length_errors++; | ||
2524 | if (status & GMR_FS_FRAGMENT) | ||
2525 | skge->net_stats.rx_frame_errors++; | ||
2526 | if (status & GMR_FS_CRC_ERR) | ||
2527 | skge->net_stats.rx_crc_errors++; | ||
2528 | } | ||
2529 | |||
2530 | resubmit: | ||
2531 | skge_rx_reuse(e, skge->rx_buf_size); | ||
2532 | return NULL; | ||
2529 | } | 2533 | } |
2530 | 2534 | ||
2531 | 2535 | ||
@@ -2541,32 +2545,16 @@ static int skge_poll(struct net_device *dev, int *budget) | |||
2541 | for (e = ring->to_clean; work_done < to_do; e = e->next) { | 2545 | for (e = ring->to_clean; work_done < to_do; e = e->next) { |
2542 | struct skge_rx_desc *rd = e->desc; | 2546 | struct skge_rx_desc *rd = e->desc; |
2543 | struct sk_buff *skb; | 2547 | struct sk_buff *skb; |
2544 | u32 control, len, status; | 2548 | u32 control; |
2545 | 2549 | ||
2546 | rmb(); | 2550 | rmb(); |
2547 | control = rd->control; | 2551 | control = rd->control; |
2548 | if (control & BMU_OWN) | 2552 | if (control & BMU_OWN) |
2549 | break; | 2553 | break; |
2550 | 2554 | ||
2551 | len = control & BMU_BBC; | 2555 | skb = skge_rx_get(skge, e, control, rd->status, |
2552 | status = rd->status; | 2556 | le16_to_cpu(rd->csum2)); |
2553 | |||
2554 | if (unlikely((control & (BMU_EOF|BMU_STF)) != (BMU_STF|BMU_EOF) | ||
2555 | || bad_phy_status(hw, status))) { | ||
2556 | skge_rx_error(skge, e - ring->start, control, status); | ||
2557 | skge_rx_reuse(e, skge->rx_buf_size); | ||
2558 | continue; | ||
2559 | } | ||
2560 | |||
2561 | if (netif_msg_rx_status(skge)) | ||
2562 | printk(KERN_DEBUG PFX "%s: rx slot %td status 0x%x len %d\n", | ||
2563 | dev->name, e - ring->start, rd->status, len); | ||
2564 | |||
2565 | skb = skge_rx_get(skge, e, len); | ||
2566 | if (likely(skb)) { | 2557 | if (likely(skb)) { |
2567 | skb_put(skb, len); | ||
2568 | skb->protocol = eth_type_trans(skb, dev); | ||
2569 | |||
2570 | dev->last_rx = jiffies; | 2558 | dev->last_rx = jiffies; |
2571 | netif_receive_skb(skb); | 2559 | netif_receive_skb(skb); |
2572 | 2560 | ||
diff --git a/drivers/net/skge.h b/drivers/net/skge.h index efbf98c675d2..72c175b87a5a 100644 --- a/drivers/net/skge.h +++ b/drivers/net/skge.h | |||
@@ -953,6 +953,7 @@ enum { | |||
953 | */ | 953 | */ |
954 | enum { | 954 | enum { |
955 | XMR_FS_LEN = 0x3fff<<18, /* Bit 31..18: Rx Frame Length */ | 955 | XMR_FS_LEN = 0x3fff<<18, /* Bit 31..18: Rx Frame Length */ |
956 | XMR_FS_LEN_SHIFT = 18, | ||
956 | XMR_FS_2L_VLAN = 1<<17, /* Bit 17: tagged wh 2Lev VLAN ID*/ | 957 | XMR_FS_2L_VLAN = 1<<17, /* Bit 17: tagged wh 2Lev VLAN ID*/ |
957 | XMR_FS_1_VLAN = 1<<16, /* Bit 16: tagged wh 1ev VLAN ID*/ | 958 | XMR_FS_1_VLAN = 1<<16, /* Bit 16: tagged wh 1ev VLAN ID*/ |
958 | XMR_FS_BC = 1<<15, /* Bit 15: Broadcast Frame */ | 959 | XMR_FS_BC = 1<<15, /* Bit 15: Broadcast Frame */ |
@@ -1868,6 +1869,7 @@ enum { | |||
1868 | /* Receive Frame Status Encoding */ | 1869 | /* Receive Frame Status Encoding */ |
1869 | enum { | 1870 | enum { |
1870 | GMR_FS_LEN = 0xffff<<16, /* Bit 31..16: Rx Frame Length */ | 1871 | GMR_FS_LEN = 0xffff<<16, /* Bit 31..16: Rx Frame Length */ |
1872 | GMR_FS_LEN_SHIFT = 16, | ||
1871 | GMR_FS_VLAN = 1<<13, /* Bit 13: VLAN Packet */ | 1873 | GMR_FS_VLAN = 1<<13, /* Bit 13: VLAN Packet */ |
1872 | GMR_FS_JABBER = 1<<12, /* Bit 12: Jabber Packet */ | 1874 | GMR_FS_JABBER = 1<<12, /* Bit 12: Jabber Packet */ |
1873 | GMR_FS_UN_SIZE = 1<<11, /* Bit 11: Undersize Packet */ | 1875 | GMR_FS_UN_SIZE = 1<<11, /* Bit 11: Undersize Packet */ |
diff --git a/drivers/pci/hotplug.c b/drivers/pci/hotplug.c index 10444988a10b..e1743be31909 100644 --- a/drivers/pci/hotplug.c +++ b/drivers/pci/hotplug.c | |||
@@ -7,7 +7,6 @@ int pci_hotplug (struct device *dev, char **envp, int num_envp, | |||
7 | char *buffer, int buffer_size) | 7 | char *buffer, int buffer_size) |
8 | { | 8 | { |
9 | struct pci_dev *pdev; | 9 | struct pci_dev *pdev; |
10 | char *scratch; | ||
11 | int i = 0; | 10 | int i = 0; |
12 | int length = 0; | 11 | int length = 0; |
13 | 12 | ||
@@ -18,9 +17,6 @@ int pci_hotplug (struct device *dev, char **envp, int num_envp, | |||
18 | if (!pdev) | 17 | if (!pdev) |
19 | return -ENODEV; | 18 | return -ENODEV; |
20 | 19 | ||
21 | scratch = buffer; | ||
22 | |||
23 | |||
24 | if (add_hotplug_env_var(envp, num_envp, &i, | 20 | if (add_hotplug_env_var(envp, num_envp, &i, |
25 | buffer, buffer_size, &length, | 21 | buffer, buffer_size, &length, |
26 | "PCI_CLASS=%04X", pdev->class)) | 22 | "PCI_CLASS=%04X", pdev->class)) |
diff --git a/drivers/pci/hotplug/rpadlpar_sysfs.c b/drivers/pci/hotplug/rpadlpar_sysfs.c index 752e6513c447..db69be85b458 100644 --- a/drivers/pci/hotplug/rpadlpar_sysfs.c +++ b/drivers/pci/hotplug/rpadlpar_sysfs.c | |||
@@ -62,7 +62,7 @@ static ssize_t add_slot_store(struct dlpar_io_attr *dlpar_attr, | |||
62 | char drc_name[MAX_DRC_NAME_LEN]; | 62 | char drc_name[MAX_DRC_NAME_LEN]; |
63 | char *end; | 63 | char *end; |
64 | 64 | ||
65 | if (nbytes > MAX_DRC_NAME_LEN) | 65 | if (nbytes >= MAX_DRC_NAME_LEN) |
66 | return 0; | 66 | return 0; |
67 | 67 | ||
68 | memcpy(drc_name, buf, nbytes); | 68 | memcpy(drc_name, buf, nbytes); |
@@ -83,7 +83,7 @@ static ssize_t remove_slot_store(struct dlpar_io_attr *dlpar_attr, | |||
83 | char drc_name[MAX_DRC_NAME_LEN]; | 83 | char drc_name[MAX_DRC_NAME_LEN]; |
84 | char *end; | 84 | char *end; |
85 | 85 | ||
86 | if (nbytes > MAX_DRC_NAME_LEN) | 86 | if (nbytes >= MAX_DRC_NAME_LEN) |
87 | return 0; | 87 | return 0; |
88 | 88 | ||
89 | memcpy(drc_name, buf, nbytes); | 89 | memcpy(drc_name, buf, nbytes); |
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index b1409441c1cd..a32ae82e5922 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c | |||
@@ -159,7 +159,7 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot, | |||
159 | 159 | ||
160 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); | 160 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); |
161 | 161 | ||
162 | slot = kcalloc(1, sizeof(*slot), GFP_KERNEL); | 162 | slot = kzalloc(sizeof(*slot), GFP_KERNEL); |
163 | if (!slot) | 163 | if (!slot) |
164 | return -ENOMEM; | 164 | return -ENOMEM; |
165 | bss_hotplug_slot->private = slot; | 165 | bss_hotplug_slot->private = slot; |
@@ -491,7 +491,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus) | |||
491 | if (sn_pci_slot_valid(pci_bus, device) != 1) | 491 | if (sn_pci_slot_valid(pci_bus, device) != 1) |
492 | continue; | 492 | continue; |
493 | 493 | ||
494 | bss_hotplug_slot = kcalloc(1, sizeof(*bss_hotplug_slot), | 494 | bss_hotplug_slot = kzalloc(sizeof(*bss_hotplug_slot), |
495 | GFP_KERNEL); | 495 | GFP_KERNEL); |
496 | if (!bss_hotplug_slot) { | 496 | if (!bss_hotplug_slot) { |
497 | rc = -ENOMEM; | 497 | rc = -ENOMEM; |
@@ -499,7 +499,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus) | |||
499 | } | 499 | } |
500 | 500 | ||
501 | bss_hotplug_slot->info = | 501 | bss_hotplug_slot->info = |
502 | kcalloc(1, sizeof(struct hotplug_slot_info), | 502 | kzalloc(sizeof(struct hotplug_slot_info), |
503 | GFP_KERNEL); | 503 | GFP_KERNEL); |
504 | if (!bss_hotplug_slot->info) { | 504 | if (!bss_hotplug_slot->info) { |
505 | rc = -ENOMEM; | 505 | rc = -ENOMEM; |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 56a3b397efee..2898830c496f 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -360,7 +360,7 @@ pci_create_resource_files(struct pci_dev *pdev) | |||
360 | continue; | 360 | continue; |
361 | 361 | ||
362 | /* allocate attribute structure, piggyback attribute name */ | 362 | /* allocate attribute structure, piggyback attribute name */ |
363 | res_attr = kcalloc(1, sizeof(*res_attr) + 10, GFP_ATOMIC); | 363 | res_attr = kzalloc(sizeof(*res_attr) + 10, GFP_ATOMIC); |
364 | if (res_attr) { | 364 | if (res_attr) { |
365 | char *res_attr_name = (char *)(res_attr + 1); | 365 | char *res_attr_name = (char *)(res_attr + 1); |
366 | 366 | ||
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 26a55d08b506..c77d5b1bbff6 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -165,7 +165,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) | |||
165 | if (l == 0xffffffff) | 165 | if (l == 0xffffffff) |
166 | l = 0; | 166 | l = 0; |
167 | if ((l & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) { | 167 | if ((l & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) { |
168 | sz = pci_size(l, sz, PCI_BASE_ADDRESS_MEM_MASK); | 168 | sz = pci_size(l, sz, (u32)PCI_BASE_ADDRESS_MEM_MASK); |
169 | if (!sz) | 169 | if (!sz) |
170 | continue; | 170 | continue; |
171 | res->start = l & PCI_BASE_ADDRESS_MEM_MASK; | 171 | res->start = l & PCI_BASE_ADDRESS_MEM_MASK; |
@@ -215,7 +215,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) | |||
215 | if (l == 0xffffffff) | 215 | if (l == 0xffffffff) |
216 | l = 0; | 216 | l = 0; |
217 | if (sz && sz != 0xffffffff) { | 217 | if (sz && sz != 0xffffffff) { |
218 | sz = pci_size(l, sz, PCI_ROM_ADDRESS_MASK); | 218 | sz = pci_size(l, sz, (u32)PCI_ROM_ADDRESS_MASK); |
219 | if (sz) { | 219 | if (sz) { |
220 | res->flags = (l & IORESOURCE_ROM_ENABLE) | | 220 | res->flags = (l & IORESOURCE_ROM_ENABLE) | |
221 | IORESOURCE_MEM | IORESOURCE_PREFETCH | | 221 | IORESOURCE_MEM | IORESOURCE_PREFETCH | |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index 91ea8e4777f3..dbb3eb0e330b 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -437,7 +437,7 @@ __ccwgroup_get_gdev_by_cdev(struct ccw_device *cdev) | |||
437 | if (cdev->dev.driver_data) { | 437 | if (cdev->dev.driver_data) { |
438 | gdev = (struct ccwgroup_device *)cdev->dev.driver_data; | 438 | gdev = (struct ccwgroup_device *)cdev->dev.driver_data; |
439 | if (get_device(&gdev->dev)) { | 439 | if (get_device(&gdev->dev)) { |
440 | if (klist_node_attached(&gdev->dev.knode_bus)) | 440 | if (device_is_registered(&gdev->dev)) |
441 | return gdev; | 441 | return gdev; |
442 | put_device(&gdev->dev); | 442 | put_device(&gdev->dev); |
443 | } | 443 | } |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index c47c8052b486..f1fb67fe22a8 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -987,7 +987,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
987 | 987 | ||
988 | /* remove this interface if it has been registered */ | 988 | /* remove this interface if it has been registered */ |
989 | interface = dev->actconfig->interface[i]; | 989 | interface = dev->actconfig->interface[i]; |
990 | if (!klist_node_attached(&interface->dev.knode_bus)) | 990 | if (!device_is_registered(&interface->dev)) |
991 | continue; | 991 | continue; |
992 | dev_dbg (&dev->dev, "unregistering interface %s\n", | 992 | dev_dbg (&dev->dev, "unregistering interface %s\n", |
993 | interface->dev.bus_id); | 993 | interface->dev.bus_id); |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 087af73a59dd..7d131509e419 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -303,7 +303,7 @@ int usb_driver_claim_interface(struct usb_driver *driver, | |||
303 | /* if interface was already added, bind now; else let | 303 | /* if interface was already added, bind now; else let |
304 | * the future device_add() bind it, bypassing probe() | 304 | * the future device_add() bind it, bypassing probe() |
305 | */ | 305 | */ |
306 | if (klist_node_attached(&dev->knode_bus)) | 306 | if (device_is_registered(dev)) |
307 | device_bind_driver(dev); | 307 | device_bind_driver(dev); |
308 | 308 | ||
309 | return 0; | 309 | return 0; |
@@ -336,8 +336,8 @@ void usb_driver_release_interface(struct usb_driver *driver, | |||
336 | if (iface->condition != USB_INTERFACE_BOUND) | 336 | if (iface->condition != USB_INTERFACE_BOUND) |
337 | return; | 337 | return; |
338 | 338 | ||
339 | /* release only after device_add() */ | 339 | /* don't release if the interface hasn't been added yet */ |
340 | if (klist_node_attached(&dev->knode_bus)) { | 340 | if (device_is_registered(dev)) { |
341 | iface->condition = USB_INTERFACE_UNBINDING; | 341 | iface->condition = USB_INTERFACE_UNBINDING; |
342 | device_release_driver(dev); | 342 | device_release_driver(dev); |
343 | } | 343 | } |
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 1507738337c4..73f8c9404156 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -422,7 +422,7 @@ static inline void ep0_idle (struct pxa2xx_udc *dev) | |||
422 | } | 422 | } |
423 | 423 | ||
424 | static int | 424 | static int |
425 | write_packet(volatile u32 *uddr, struct pxa2xx_request *req, unsigned max) | 425 | write_packet(volatile unsigned long *uddr, struct pxa2xx_request *req, unsigned max) |
426 | { | 426 | { |
427 | u8 *buf; | 427 | u8 *buf; |
428 | unsigned length, count; | 428 | unsigned length, count; |
@@ -2602,7 +2602,7 @@ static int __exit pxa2xx_udc_remove(struct device *_dev) | |||
2602 | * VBUS IRQs should probably be ignored so that the PXA device just acts | 2602 | * VBUS IRQs should probably be ignored so that the PXA device just acts |
2603 | * "dead" to USB hosts until system resume. | 2603 | * "dead" to USB hosts until system resume. |
2604 | */ | 2604 | */ |
2605 | static int pxa2xx_udc_suspend(struct device *dev, u32 state, u32 level) | 2605 | static int pxa2xx_udc_suspend(struct device *dev, pm_message_t state, u32 level) |
2606 | { | 2606 | { |
2607 | struct pxa2xx_udc *udc = dev_get_drvdata(dev); | 2607 | struct pxa2xx_udc *udc = dev_get_drvdata(dev); |
2608 | 2608 | ||
diff --git a/drivers/usb/gadget/pxa2xx_udc.h b/drivers/usb/gadget/pxa2xx_udc.h index d0bc396a85d5..a58f3e6e71f1 100644 --- a/drivers/usb/gadget/pxa2xx_udc.h +++ b/drivers/usb/gadget/pxa2xx_udc.h | |||
@@ -69,11 +69,11 @@ struct pxa2xx_ep { | |||
69 | * UDDR = UDC Endpoint Data Register (the fifo) | 69 | * UDDR = UDC Endpoint Data Register (the fifo) |
70 | * DRCM = DMA Request Channel Map | 70 | * DRCM = DMA Request Channel Map |
71 | */ | 71 | */ |
72 | volatile u32 *reg_udccs; | 72 | volatile unsigned long *reg_udccs; |
73 | volatile u32 *reg_ubcr; | 73 | volatile unsigned long *reg_ubcr; |
74 | volatile u32 *reg_uddr; | 74 | volatile unsigned long *reg_uddr; |
75 | #ifdef USE_DMA | 75 | #ifdef USE_DMA |
76 | volatile u32 *reg_drcmr; | 76 | volatile unsigned long *reg_drcmr; |
77 | #define drcmr(n) .reg_drcmr = & DRCMR ## n , | 77 | #define drcmr(n) .reg_drcmr = & DRCMR ## n , |
78 | #else | 78 | #else |
79 | #define drcmr(n) | 79 | #define drcmr(n) |
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index d2a1fd40dfcb..d42a15d10a46 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
@@ -782,6 +782,9 @@ retry: | |||
782 | /* usb 1.1 says max 90% of a frame is available for periodic transfers. | 782 | /* usb 1.1 says max 90% of a frame is available for periodic transfers. |
783 | * this driver doesn't promise that much since it's got to handle an | 783 | * this driver doesn't promise that much since it's got to handle an |
784 | * IRQ per packet; irq handling latencies also use up that time. | 784 | * IRQ per packet; irq handling latencies also use up that time. |
785 | * | ||
786 | * NOTE: the periodic schedule is a sparse tree, with the load for | ||
787 | * each branch minimized. see fig 3.5 in the OHCI spec for example. | ||
785 | */ | 788 | */ |
786 | #define MAX_PERIODIC_LOAD 500 /* out of 1000 usec */ | 789 | #define MAX_PERIODIC_LOAD 500 /* out of 1000 usec */ |
787 | 790 | ||
@@ -843,6 +846,7 @@ static int sl811h_urb_enqueue( | |||
843 | if (!(sl811->port1 & (1 << USB_PORT_FEAT_ENABLE)) | 846 | if (!(sl811->port1 & (1 << USB_PORT_FEAT_ENABLE)) |
844 | || !HC_IS_RUNNING(hcd->state)) { | 847 | || !HC_IS_RUNNING(hcd->state)) { |
845 | retval = -ENODEV; | 848 | retval = -ENODEV; |
849 | kfree(ep); | ||
846 | goto fail; | 850 | goto fail; |
847 | } | 851 | } |
848 | 852 | ||
@@ -911,8 +915,16 @@ static int sl811h_urb_enqueue( | |||
911 | case PIPE_ISOCHRONOUS: | 915 | case PIPE_ISOCHRONOUS: |
912 | case PIPE_INTERRUPT: | 916 | case PIPE_INTERRUPT: |
913 | urb->interval = ep->period; | 917 | urb->interval = ep->period; |
914 | if (ep->branch < PERIODIC_SIZE) | 918 | if (ep->branch < PERIODIC_SIZE) { |
919 | /* NOTE: the phase is correct here, but the value | ||
920 | * needs offsetting by the transfer queue depth. | ||
921 | * All current drivers ignore start_frame, so this | ||
922 | * is unlikely to ever matter... | ||
923 | */ | ||
924 | urb->start_frame = (sl811->frame & (PERIODIC_SIZE - 1)) | ||
925 | + ep->branch; | ||
915 | break; | 926 | break; |
927 | } | ||
916 | 928 | ||
917 | retval = balance(sl811, ep->period, ep->load); | 929 | retval = balance(sl811, ep->period, ep->load); |
918 | if (retval < 0) | 930 | if (retval < 0) |
@@ -1122,7 +1134,7 @@ sl811h_hub_descriptor ( | |||
1122 | desc->wHubCharacteristics = (__force __u16)cpu_to_le16(temp); | 1134 | desc->wHubCharacteristics = (__force __u16)cpu_to_le16(temp); |
1123 | 1135 | ||
1124 | /* two bitmaps: ports removable, and legacy PortPwrCtrlMask */ | 1136 | /* two bitmaps: ports removable, and legacy PortPwrCtrlMask */ |
1125 | desc->bitmap[0] = 1 << 1; | 1137 | desc->bitmap[0] = 0 << 1; |
1126 | desc->bitmap[1] = ~0; | 1138 | desc->bitmap[1] = ~0; |
1127 | } | 1139 | } |
1128 | 1140 | ||
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 7484d34780fc..6a4ffe6c3977 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c | |||
@@ -648,6 +648,13 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
648 | } | 648 | } |
649 | 649 | ||
650 | /* | 650 | /* |
651 | * If the packet is unreasonably long, quietly drop it rather than | ||
652 | * kernel panicing by calling skb_put. | ||
653 | */ | ||
654 | if (pkt_len > PEGASUS_MTU) | ||
655 | goto goon; | ||
656 | |||
657 | /* | ||
651 | * at this point we are sure pegasus->rx_skb != NULL | 658 | * at this point we are sure pegasus->rx_skb != NULL |
652 | * so we go ahead and pass up the packet. | 659 | * so we go ahead and pass up the packet. |
653 | */ | 660 | */ |
@@ -886,15 +893,17 @@ static inline void get_interrupt_interval(pegasus_t * pegasus) | |||
886 | __u8 data[2]; | 893 | __u8 data[2]; |
887 | 894 | ||
888 | read_eprom_word(pegasus, 4, (__u16 *) data); | 895 | read_eprom_word(pegasus, 4, (__u16 *) data); |
889 | if (data[1] < 0x80) { | 896 | if (pegasus->usb->speed != USB_SPEED_HIGH) { |
890 | if (netif_msg_timer(pegasus)) | 897 | if (data[1] < 0x80) { |
891 | dev_info(&pegasus->intf->dev, | 898 | if (netif_msg_timer(pegasus)) |
892 | "intr interval changed from %ums to %ums\n", | 899 | dev_info(&pegasus->intf->dev, "intr interval " |
893 | data[1], 0x80); | 900 | "changed from %ums to %ums\n", |
894 | data[1] = 0x80; | 901 | data[1], 0x80); |
895 | #ifdef PEGASUS_WRITE_EEPROM | 902 | data[1] = 0x80; |
896 | write_eprom_word(pegasus, 4, *(__u16 *) data); | 903 | #ifdef PEGASUS_WRITE_EEPROM |
904 | write_eprom_word(pegasus, 4, *(__u16 *) data); | ||
897 | #endif | 905 | #endif |
906 | } | ||
898 | } | 907 | } |
899 | pegasus->intr_interval = data[1]; | 908 | pegasus->intr_interval = data[1]; |
900 | } | 909 | } |
@@ -904,8 +913,9 @@ static void set_carrier(struct net_device *net) | |||
904 | pegasus_t *pegasus = netdev_priv(net); | 913 | pegasus_t *pegasus = netdev_priv(net); |
905 | u16 tmp; | 914 | u16 tmp; |
906 | 915 | ||
907 | if (read_mii_word(pegasus, pegasus->phy, MII_BMSR, &tmp)) | 916 | if (!read_mii_word(pegasus, pegasus->phy, MII_BMSR, &tmp)) |
908 | return; | 917 | return; |
918 | |||
909 | if (tmp & BMSR_LSTATUS) | 919 | if (tmp & BMSR_LSTATUS) |
910 | netif_carrier_on(net); | 920 | netif_carrier_on(net); |
911 | else | 921 | else |
@@ -1355,6 +1365,7 @@ static void pegasus_disconnect(struct usb_interface *intf) | |||
1355 | cancel_delayed_work(&pegasus->carrier_check); | 1365 | cancel_delayed_work(&pegasus->carrier_check); |
1356 | unregister_netdev(pegasus->net); | 1366 | unregister_netdev(pegasus->net); |
1357 | usb_put_dev(interface_to_usbdev(intf)); | 1367 | usb_put_dev(interface_to_usbdev(intf)); |
1368 | unlink_all_urbs(pegasus); | ||
1358 | free_all_urbs(pegasus); | 1369 | free_all_urbs(pegasus); |
1359 | free_skb_pool(pegasus); | 1370 | free_skb_pool(pegasus); |
1360 | if (pegasus->rx_skb) | 1371 | if (pegasus->rx_skb) |
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index a4ce0008d69b..926d4c2c1600 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -16,7 +16,8 @@ | |||
16 | #include "usb-serial.h" | 16 | #include "usb-serial.h" |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0xf3d, 0x0112) }, | 19 | { USB_DEVICE(0xf3d, 0x0112) }, /* AirPrime CDMA Wireless PC Card */ |
20 | { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ | ||
20 | { }, | 21 | { }, |
21 | }; | 22 | }; |
22 | MODULE_DEVICE_TABLE(usb, id_table); | 23 | MODULE_DEVICE_TABLE(usb, id_table); |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 4e434cb10bb1..5a8631c8a4a7 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -1846,10 +1846,12 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct termios *old_ | |||
1846 | } else { | 1846 | } else { |
1847 | /* set the baudrate determined before */ | 1847 | /* set the baudrate determined before */ |
1848 | if (change_speed(port)) { | 1848 | if (change_speed(port)) { |
1849 | err("%s urb failed to set baurdrate", __FUNCTION__); | 1849 | err("%s urb failed to set baudrate", __FUNCTION__); |
1850 | } | ||
1851 | /* Ensure RTS and DTR are raised when baudrate changed from 0 */ | ||
1852 | if ((old_termios->c_cflag & CBAUD) == B0) { | ||
1853 | set_mctrl(port, TIOCM_DTR | TIOCM_RTS); | ||
1850 | } | 1854 | } |
1851 | /* Ensure RTS and DTR are raised */ | ||
1852 | set_mctrl(port, TIOCM_DTR | TIOCM_RTS); | ||
1853 | } | 1855 | } |
1854 | 1856 | ||
1855 | /* Set flow control */ | 1857 | /* Set flow control */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 92d0f925d053..4989e5740d18 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -25,6 +25,9 @@ | |||
25 | 2005-06-20 v0.4.1 add missing braces :-/ | 25 | 2005-06-20 v0.4.1 add missing braces :-/ |
26 | killed end-of-line whitespace | 26 | killed end-of-line whitespace |
27 | 2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2 | 27 | 2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2 |
28 | 2005-09-10 v0.4.3 added HUAWEI E600 card and Audiovox AirCard | ||
29 | 2005-09-20 v0.4.4 increased recv buffer size: the card sometimes | ||
30 | wants to send >2000 bytes. | ||
28 | 31 | ||
29 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> | 32 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> |
30 | 33 | ||
@@ -71,15 +74,21 @@ static int option_send_setup(struct usb_serial_port *port); | |||
71 | 74 | ||
72 | /* Vendor and product IDs */ | 75 | /* Vendor and product IDs */ |
73 | #define OPTION_VENDOR_ID 0x0AF0 | 76 | #define OPTION_VENDOR_ID 0x0AF0 |
77 | #define HUAWEI_VENDOR_ID 0x12D1 | ||
78 | #define AUDIOVOX_VENDOR_ID 0x0F3D | ||
74 | 79 | ||
75 | #define OPTION_PRODUCT_OLD 0x5000 | 80 | #define OPTION_PRODUCT_OLD 0x5000 |
76 | #define OPTION_PRODUCT_FUSION 0x6000 | 81 | #define OPTION_PRODUCT_FUSION 0x6000 |
77 | #define OPTION_PRODUCT_FUSION2 0x6300 | 82 | #define OPTION_PRODUCT_FUSION2 0x6300 |
83 | #define HUAWEI_PRODUCT_E600 0x1001 | ||
84 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 | ||
78 | 85 | ||
79 | static struct usb_device_id option_ids[] = { | 86 | static struct usb_device_id option_ids[] = { |
80 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, | 87 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, |
81 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, | 88 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, |
82 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 89 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
90 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | ||
91 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | ||
83 | { } /* Terminating entry */ | 92 | { } /* Terminating entry */ |
84 | }; | 93 | }; |
85 | 94 | ||
@@ -132,7 +141,7 @@ static int debug; | |||
132 | 141 | ||
133 | #define N_IN_URB 4 | 142 | #define N_IN_URB 4 |
134 | #define N_OUT_URB 1 | 143 | #define N_OUT_URB 1 |
135 | #define IN_BUFLEN 1024 | 144 | #define IN_BUFLEN 4096 |
136 | #define OUT_BUFLEN 128 | 145 | #define OUT_BUFLEN 128 |
137 | 146 | ||
138 | struct option_port_private { | 147 | struct option_port_private { |
diff --git a/include/linux/device.h b/include/linux/device.h index 06e5d42f2c7b..95d607a48f06 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -317,6 +317,11 @@ dev_set_drvdata (struct device *dev, void *data) | |||
317 | dev->driver_data = data; | 317 | dev->driver_data = data; |
318 | } | 318 | } |
319 | 319 | ||
320 | static inline int device_is_registered(struct device *dev) | ||
321 | { | ||
322 | return klist_node_attached(&dev->knode_bus); | ||
323 | } | ||
324 | |||
320 | /* | 325 | /* |
321 | * High level routines for use by the bus drivers | 326 | * High level routines for use by the bus drivers |
322 | */ | 327 | */ |