Am Freitag, 14. Mai 2004 16:56 schrieb Alan Stern:
> On Fri, 14 May 2004, Oliver Neukum wrote:
> 
> > 
> > > Do we really need both an inline and a non-inline version of the same
> > 
> > No, but we are in a stable series and it's part of an official header file.
> 
> If you want to keep the inline function that's already in usb.h, you 
> could redefine it so that the non-in_interrupt() part calls the new 
> function.  Then after the drivers have been audited, the inline function 
> could be removed from usb.h.

In that case I prefer a clean cut. Here it is. And yes, the ifdef is ugly,
but the helper functions in that area of the kernel are currently in flux.

        Regards
                Oliver

You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


[EMAIL PROTECTED], 2004-05-14 22:23:07+02:00, [EMAIL PROTECTED]
  - safe delays, even if on a waitqueue


 drivers/usb/core/hub.c              |   10 +++++-----
 drivers/usb/core/usb.c              |   23 ++++++++++++++++++++---
 drivers/usb/host/ehci-hcd.c         |    4 ++--
 drivers/usb/host/ohci-hcd.c         |    4 ++--
 drivers/usb/misc/usbtest.c          |    2 +-
 drivers/usb/net/usbnet.c            |    2 +-
 drivers/usb/serial/io_ti.c          |    4 ++--
 drivers/usb/storage/datafab.c       |    2 +-
 drivers/usb/storage/isd200.c        |    4 ++--
 drivers/usb/storage/jumpshot.c      |    2 +-
 drivers/usb/storage/shuttle_usbat.c |   14 +++++++-------
 include/linux/usb.h                 |   11 +----------
 12 files changed, 45 insertions(+), 37 deletions(-)


diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c    Fri May 14 22:52:42 2004
+++ b/drivers/usb/core/hub.c    Fri May 14 22:52:42 2004
@@ -381,7 +381,7 @@
                set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
 
        /* Wait for power to be enabled */
-       wait_ms(hub->descriptor->bPwrOn2PwrGood * 2);
+       usb_uninterruptible_sleep_ms(hub->descriptor->bPwrOn2PwrGood * 2);
 }
 
 static int hub_hub_status(struct usb_hub *hub,
@@ -860,7 +860,7 @@
                        delay_time < HUB_RESET_TIMEOUT;
                        delay_time += delay) {
                /* wait to give the device a chance to reset */
-               wait_ms(delay);
+               usb_uninterruptible_sleep_ms(delay);
 
                /* read and decode port status */
                ret = hub_port_status(hub, port, &portstatus, &portchange);
@@ -975,7 +975,7 @@
        connection = 0;
        stable_count = 0;
        for (delay_time = 0; delay_time < HUB_DEBOUNCE_TIMEOUT; delay_time += 
HUB_DEBOUNCE_STEP) {
-               wait_ms(HUB_DEBOUNCE_STEP);
+               usb_uninterruptible_sleep_ms(HUB_DEBOUNCE_STEP);
 
                ret = hub_port_status(hub, port, &portstatus, &portchange);
                if (ret < 0)
@@ -1233,7 +1233,7 @@
                        }
                        if (hubchange & HUB_CHANGE_OVERCURRENT) {
                                dev_dbg (&hub->intf->dev, "overcurrent change\n");
-                               wait_ms(500);   /* Cool down */
+                               usb_uninterruptible_sleep_ms(500);      /* Cool down */
                                clear_hub_feature(dev, C_HUB_OVER_CURRENT);
                                hub_power_on(hub);
                        }
@@ -1388,7 +1388,7 @@
        }
 
        /* Let the SET_ADDRESS settle */
-       wait_ms(10);
+       usb_uninterruptible_sleep_ms(10);
 
        up(&usb_address0_sem);
 
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c    Fri May 14 22:52:42 2004
+++ b/drivers/usb/core/usb.c    Fri May 14 22:52:42 2004
@@ -39,6 +39,7 @@
 #include <linux/spinlock.h>
 #include <linux/errno.h>
 #include <linux/smp_lock.h>
+#include <linux/time.h>
 #include <linux/usb.h>
 
 #include <asm/io.h>
@@ -1112,7 +1113,7 @@
                        err = usb_set_address(dev);
                        if (err >= 0)
                                break;
-                       wait_ms(200);
+                       usb_uninterruptible_sleep_ms(200);
                }
                if (err < 0) {
                        dev_err(&dev->dev,
@@ -1121,13 +1122,13 @@
                        goto fail;
                }
 
-               wait_ms(10);    /* Let the SET_ADDRESS settle */
+               usb_uninterruptible_sleep_ms(10);       /* Let the SET_ADDRESS settle 
*/
 
                /* high and low speed devices don't need this... */
                err = usb_get_device_descriptor(dev, 8);
                if (err >= 8)
                        break;
-               wait_ms(100);
+               usb_uninterruptible_sleep_ms(100);
        }
 
        if (err < 8) {
@@ -1543,6 +1544,20 @@
        return 0;
 }
 
+void usb_uninterruptible_sleep_ms(long msecs)
+{
+#if HZ == 1000
+       long timeout = msecs;
+#else
+       long timeout = (((long)msecs) * HZ) / 1000 + 1;
+#endif
+
+       while(timeout) {
+               set_current_state(TASK_UNINTERRUPTIBLE);
+               timeout = schedule_timeout(timeout);
+       }
+}
+
 struct bus_type usb_bus_type = {
        .name =         "usb",
        .match =        usb_device_match,
@@ -1643,6 +1658,8 @@
 
 EXPORT_SYMBOL(usb_find_device);
 EXPORT_SYMBOL(usb_get_current_frame_number);
+
+EXPORT_SYMBOL(usb_uninterruptible_sleep_ms);
 
 EXPORT_SYMBOL (usb_buffer_alloc);
 EXPORT_SYMBOL (usb_buffer_free);
diff -Nru a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
--- a/drivers/usb/host/ehci-hcd.c       Fri May 14 22:52:43 2004
+++ b/drivers/usb/host/ehci-hcd.c       Fri May 14 22:52:43 2004
@@ -295,7 +295,7 @@
 
                /* and wait a while for it to happen */
                do {
-                       wait_ms (10);
+                       usb_uninterruptible_sleep_ms (10);
                        msec -= 10;
                        pci_read_config_dword (to_pci_dev(ehci->hcd.self.controller), 
where, &cap);
                } while ((cap & (1 << 16)) && msec);
@@ -685,7 +685,7 @@
                writel (temp, &ehci->regs->port_status [i]);
                readl (&ehci->regs->command);   /* unblock posted writes */
 
-               wait_ms (20);
+               usb_uninterruptible_sleep_ms (20);
                temp &= ~PORT_RESUME;
                writel (temp, &ehci->regs->port_status [i]);
        }
diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
--- a/drivers/usb/host/ohci-hcd.c       Fri May 14 22:52:42 2004
+++ b/drivers/usb/host/ohci-hcd.c       Fri May 14 22:52:42 2004
@@ -413,7 +413,7 @@
                writel (OHCI_INTR_OC, &ohci->regs->intrenable);
                writel (OHCI_OCR, &ohci->regs->cmdstatus);
                while (readl (&ohci->regs->control) & OHCI_CTRL_IR) {
-                       wait_ms (10);
+                       usb_uninterruptible_sleep_ms (10);
                        if (--temp == 0) {
                                ohci_err (ohci, "USB HC TakeOver failed!\n");
                                return -1;
@@ -444,7 +444,7 @@
        }
        // flush those pci writes
        (void) readl (&ohci->regs->control);
-       wait_ms (50);
+       usb_uninterruptible_sleep_ms (50);
 
        /* HC Reset requires max 10 us delay */
        writel (OHCI_HCR,  &ohci->regs->cmdstatus);
diff -Nru a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
--- a/drivers/usb/misc/usbtest.c        Fri May 14 22:52:43 2004
+++ b/drivers/usb/misc/usbtest.c        Fri May 14 22:52:43 2004
@@ -1074,7 +1074,7 @@
        /* unlinking that should always work.  variable delay tests more
         * hcd states and code paths, even with little other system load.
         */
-       wait_ms (jiffies % (2 * INTERRUPT_RATE));
+       usb_uninterruptible_sleep_ms (jiffies % (2 * INTERRUPT_RATE));
 retry:
        retval = usb_unlink_urb (urb);
        if (retval == -EBUSY) {
diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
--- a/drivers/usb/net/usbnet.c  Fri May 14 22:52:43 2004
+++ b/drivers/usb/net/usbnet.c  Fri May 14 22:52:43 2004
@@ -729,7 +729,7 @@
                                        (gpio_bits >> (i * 8)) & 0xff, 0, 0,
                                        buf)) < 0)
                        return ret;
-               wait_ms(5);
+               usb_uninterruptible_sleep_ms(5);
        }
 
        if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x80, 0, 0, buf)) < 0) {
diff -Nru a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
--- a/drivers/usb/serial/io_ti.c        Fri May 14 22:52:43 2004
+++ b/drivers/usb/serial/io_ti.c        Fri May 14 22:52:43 2004
@@ -552,7 +552,7 @@
                        break;
 
                /* Block the thread for 10ms */
-               wait_ms (10);
+               usb_uninterruptible_sleep_ms (10);
 
                if (last_count == port->tx.count) {
                        /* No activity.. count down. */
@@ -581,7 +581,7 @@
                /* This function takes 4 ms; */
                if (!TIIsTxActive (port)) {
                        /* Delay a few char times */
-                       wait_ms (50);
+                       usb_uninterruptible_sleep_ms (50);
                        dbg ("%s - Empty", __FUNCTION__);
                        return;
                }
diff -Nru a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c
--- a/drivers/usb/storage/datafab.c     Fri May 14 22:52:43 2004
+++ b/drivers/usb/storage/datafab.c     Fri May 14 22:52:43 2004
@@ -321,7 +321,7 @@
                        goto leave;
                }
 
-               wait_ms(20);
+               usb_uninterruptible_sleep_ms(20);
        }
 
        rc = USB_STOR_TRANSPORT_ERROR;
diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
--- a/drivers/usb/storage/isd200.c      Fri May 14 22:52:42 2004
+++ b/drivers/usb/storage/isd200.c      Fri May 14 22:52:42 2004
@@ -806,7 +806,7 @@
                retStatus = ISD200_ERROR;
        } else {
                /* delay 10ms to give the drive a chance to see it */
-               wait_ms(10);
+               usb_uninterruptible_sleep_ms(10);
 
                transferStatus = isd200_action( us, ACTION_REENABLE, NULL, 0 );
                if (transferStatus != ISD200_TRANSPORT_GOOD) {
@@ -814,7 +814,7 @@
                        retStatus = ISD200_ERROR;
                } else {
                        /* delay 50ms to give the drive a chance to recover after SRST 
*/
-                       wait_ms(50);
+                       usb_uninterruptible_sleep_ms(50);
                }
        }
 
diff -Nru a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c
--- a/drivers/usb/storage/jumpshot.c    Fri May 14 22:52:42 2004
+++ b/drivers/usb/storage/jumpshot.c    Fri May 14 22:52:42 2004
@@ -253,7 +253,7 @@
                        if (result != USB_STOR_TRANSPORT_GOOD) {
                                // I have not experimented to find the smallest value.
                                //
-                               wait_ms(50); 
+                               usb_uninterruptible_sleep_ms(50); 
                        }
                } while ((result != USB_STOR_TRANSPORT_GOOD) && (waitcount < 10));
 
diff -Nru a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
--- a/drivers/usb/storage/shuttle_usbat.c       Fri May 14 22:52:42 2004
+++ b/drivers/usb/storage/shuttle_usbat.c       Fri May 14 22:52:42 2004
@@ -202,13 +202,13 @@
                }
 
                if (i<500)
-                       wait_ms(10); // 5 seconds
+                       usb_uninterruptible_sleep_ms(10); // 5 seconds
                else if (i<700)
-                       wait_ms(50); // 10 seconds
+                       usb_uninterruptible_sleep_ms(50); // 10 seconds
                else if (i<1200)
-                       wait_ms(100); // 50 seconds
+                       usb_uninterruptible_sleep_ms(100); // 50 seconds
                else
-                       wait_ms(1000); // X minutes
+                       usb_uninterruptible_sleep_ms(1000); // X minutes
        }
 
        US_DEBUGP("Waited not busy for %d minutes, timing out.\n",
@@ -693,7 +693,7 @@
 
        US_DEBUGP("INIT 1\n");
 
-       wait_ms(2000);
+       usb_uninterruptible_sleep_ms(2000);
 
        if (usbat_read_user_io(us, status) !=
                        USB_STOR_XFER_GOOD)
@@ -727,7 +727,7 @@
 
        US_DEBUGP("INIT 5\n");
 
-       wait_ms(250);
+       usb_uninterruptible_sleep_ms(250);
 
        // Write 0x80 to ISA port 0x3F
 
@@ -778,7 +778,7 @@
 
        US_DEBUGP("INIT 12\n");
 
-       wait_ms(1400);
+       usb_uninterruptible_sleep_ms(1400);
 
        if (usbat_read_user_io(us, status) !=
                        USB_STOR_XFER_GOOD)
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h       Fri May 14 22:52:42 2004
+++ b/include/linux/usb.h       Fri May 14 22:52:42 2004
@@ -19,16 +19,7 @@
 #include <linux/completion.h>  /* for struct completion */
 #include <linux/sched.h>       /* for current && schedule_timeout */
 
-
-static __inline__ void wait_ms(unsigned int ms)
-{
-       if(!in_interrupt()) {
-               current->state = TASK_UNINTERRUPTIBLE;
-               schedule_timeout(1 + ms * HZ / 1000);
-       }
-       else
-               mdelay(ms);
-}
+void usb_uninterruptible_sleep_ms(long msecs);
 
 struct usb_device;
 struct usb_driver;

===================================================================


This BitKeeper patch contains the following changesets:
1.1627
## Wrapped with gzip_uu ##


begin 664 bkpatch31435
M'XL(`)LQI4```]5:^U/;2!+^V?HKIBIU59"<[EMAIL PROTECTED];E`\:C:9[E&
MTAAKD256DF&W5ON_7VL&L+&-]<A"Y9*0-I:FU=/S=??7,WJ#+G.5[?32.+I5
MF?4&?4KS`GY529JHP22=JCA*9G\,TNP*+IZE*5P<5E\/TSB.Z/`B4RH?5O?D
M5%APRZDL@@D"7?E.CPS8XS?%GS=JIW=V]-WEY_TSR]K=11\G,KE2YZI`N[M6
MD6:W,@[S/5E,XC09%)E,\JDJY"!(I^7CK27%F,)?01R&A5T2&W.G#$A(B.1$
MA9ARU^;6E5)9L:<M[T]M][HR_^>'1_SZ5!T'981PP1DNJ<"N8QTB,B`V=1#F
M0RR&A"-*=RC;P<X[3'<P1L99>^N<A-X1BOK8.D#_[(P^6@'JHUR.%0I5+/_,
[EMAIL PROTECTED]'Q^TS-E/4]HH[#'>MT[F"KW_*/96&)K0\U<[EMAIL PROTECTED]
M<);[U<[EMAIL PROTECTED])@+Q\0IN:">6_I<,9^ZQ!/*IDR&F]SW1&>09FJNN%HG#MJIX"5S
M"1:M[,OA5GFEAOED5A2Q&L%WLEBUF#&/.N4XI(+9`7&$36T:T,86;WC*HOF$
M".J"^3=59-3;/@G"83H)HCY\F)ML8TQL9I?4=1U62DR=P.4,?I$^&?/&)D\@
MWI>T+YJ*B6=72`CE;13V_;T;&[EMAIL PROTECTED]@<)('[EMAIL PROTECTED]('MQ+XH83:A):@
MT/9*7XR%'U(O#)G+J-\<"*O*%TWDX`RON3<?UBC*0U"T"`$/LH!3"AO4EL+Q
M*%:2A[X7,N6U1L"[EMAIL PROTECTED]:V++(?;HE1CWZ.48U\J&8Q;!M:CWB>!
M90MAMT.F6D&FH$QX7)0"A"@]VY:82.DK\"^6LATRU;/()`)[3JTGHR2(9Z'2
M%>H/G4PFBQG7X[0DF#):LM#SF!.PP"'"=?%XHYG/:'WB2>8P"N9=9>IJ[SI+
MY605B2J+9#R,TE$1/7C/@7AQP7NLA'6MO.?9+I&,<M_W(-J;Q_6J\B<Q0XF+
MV\?,;[/I33Y)BS51XX#J4G`_]`#X/D`R)';0.FR>/F#18LH=VBYP($41[.+5
MX`'%E)4>=H0K>2#D&&SW2&-;06\E0:SQ*Z=<M/=K*`LYEOX:MW(A2#GV2.@(
MWY%80?)T-V.S5O^BO8+:W--L[/E\6]&SETC_ZY3^7(7+K[7)[EMAIL PROTECTED]('
M,HUF;-1]RM?HCN"-^!KJDQ>B:]=1'&MF-IKF6]O`S$RI.D'][$[_`Z9UNL'S
M'7C;(<&[EMAIL PROTECTED]"][H&PT2Z*D4%DVNRDB'VA)'BMU`S:AK=^B\3A2.?H7VJ+H
M+3K^<G%T=G9Y>[EMAIL PROTECTED]"L:70MX[V\`-]-?J]4KL'$
MNN3&*`0-YL(#3-B"&DS8W3`!%)Z^&B9T*MZ`B:>3[8()(40%"2-Z-9`@&);]
M4+A<#]&B5S=&X#506:K?%59>D%8TS"9K206GE.(J<P,7$+:GH>.P;Q\ZA@)M
M@,[2;[EMAIL PROTECTED]"@A&U`+!@,[EMAIL PROTECTED];09[&3=L5.VV:I#7:66R7&0+,0P"!M
M"JE,8T=X_P?8J?JZ.NBD7P4=3NP*!D8TA`[GNGH9T27KK%">%MCI2,>L_02T
MJ'QPD*6S.UC=X"X:)/&ZNK6>CP&&@"IA`00:,_>>SG3,/Z])9PQ[W%2ZEN?;
M!4;`#2I(&+$91>N3R7)/[EMAIL PROTECTED]:R]"Z623B82%B*+!RH<+8!$HM/
M8`1H(@&.Q'`)C,9A&A%,?/M91>]N-`#$PVR[X,'%7H4'(VKP8)**2W12,:(F
M$6W.*O/^M`.(VG;/G7"TW$$3XN!J?YN6%`B.V=R&2/KF<XOI]QM`:3[A3O1&
MZ!IE1*\)-M`*..;;:?4G&=UV]BQY?3/=2_,P7CK)V+2KQP%<[EMAIL PROTECTED]>
M>:]C51&H+UYKY<T>Y(:5GT^T4SDQG8T1FY<;GM'_$*H\R*(;F'[EMAIL PROTECTED]
M%/[_+DU#:)BI3B\VT^E%BQH$Z<.;:I#G:(YL1,[EMAIL PROTECTED]<'[EMAIL PROTECTED]/++Q^/1N<7
M1Z>5`@)KJAM]([EMAIL PROTECTED];&[Y%'],T1F%ZEZ"W0U##/*+5&[EMAIL PROTECTED]
MM-RA:TC35_?G='\';2,N(29<HB/![<C17W6[2.\F;HB$Q:EVB06'T6KMC:C#
MSX:RN'3>U0X%7W4TUZE&KCV>NR^4F)4VH<3^*A+NH+[S:HV</DQL4"B79MVI
M6F*]D61$7<[EMAIL PROTECTED]:#I%`N0K2),RK\8X9WY2(5>,)7E3@&05>(P,>+%C40'2Z
M,Z*!AGL5/Z`I+&^A0(/MZ;[EMAIL PROTECTED]<8;[EMAIL PROTECTED]&E%C),?KTO+\
M]+Q=.+8XR5_:^UT3<<M'^`Q:&TH<[EMAIL PROTECTED]:X8V.#49^]4)@EZDY'691<
MH8F*;U16,1/]VD$=,]'3[1!=Q[Q:ZS?W9XOH/^9PL8BF,/$/[EMAIL PROTECTED]'6A-K(.
[EMAIL PROTECTED]/=_+!B%;483/JD#%1*'SHXO1_N'AV='Y.410E3T,9R`&S_>R21C"
MS8*#W=RZ3:,0;1P`:WB%IA"Q^;;U%SADC#[]!!A&531:/7VU\DHZ*]"NN>^]
M]4;%N5JYN+6EE6T;9<#7/OVTC89:$7J'2#4L":.Q]8O5NYM$L=JZ'[J-_H)9
MP8Q'P2S+5%*,\D(6:NMB__S[T>67QV.2XX//1S"W7F_^R#R80/&!Z=Q_]:@2
M;OO;^AL>=4QL\`2%3T<_G)Z<78S.?_SOP<GGK4T^N8_O->?.]<'[EMAIL PROTECTED]
M>_8]CVW..#,[H1`OW6G62[U%E:EI>[EMAIL PROTECTED]>%"(:TNW&1ID58OJJ%QFCV3`O2Q
M_E(*6..23M456!B&SJ1*`ZVBY/W\Q3M`7W"=SZ:[5"I%77]L_0]S*J?RXB<`
!````
`
end


-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to