usb_ep0.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:26k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) Extenex Corporation 2001
  3.  * Much folklore gleaned from original code:
  4.  *    Copyright (C) Compaq Computer Corporation, 1998, 1999
  5.  *
  6.  *  usb_ep0.c - SA1100 USB controller driver.
  7.  *              Endpoint zero management
  8.  *
  9.  *  Please see:
  10.  *    linux/Documentation/arm/SA1100/SA1100_USB
  11.  *  for details. (Especially since Intel docs are full of
  12.  *  errors about ep0 operation.) ward.willats@extenex.com.
  13.  *
  14.  * Intel also has a "Universal Serial Bus Client Device
  15.  * Validation for the StrongARM SA-1100 Microprocessor"
  16.  * document, which has flow charts and assembler test driver,
  17.  * but be careful, since it is just for validation and not
  18.  * a "real world" solution.
  19.  *
  20.  * A summary of three types of data-returning setups:
  21.  *
  22.  * 1. Setup request <= 8 bytes. That is, requests that can
  23.  *    be fullfilled in one write to the FIFO. DE is set
  24.  *    with IPR in queue_and_start_write(). (I don't know
  25.  *    if there really are any of these!)
  26.  *
  27.  * 2. Setup requests > 8 bytes (requiring more than one
  28.  *    IN to get back to the host), and we have at least
  29.  *    as much or more data than the host requested. In
  30.  *    this case we pump out everything we've got, and
  31.  *    when the final interrupt comes in due to the UDC
  32.  *    clearing the last IPR, we just set DE.
  33.  *
  34.  * 3. Setup requests > 8 bytes, but we don't have enough
  35.  *    data to satisfy the request. In this case, we send
  36.  *    everything we've got, and when the final interrupt
  37.  *    comes in due to the UDC clearing the last IPR
  38.  *    we write nothing to the FIFO and set both IPR and DE
  39.  *    so the UDC sends an empty packet and forces the host
  40.  *    to perform short packet retirement instead of stalling
  41.  *    out.
  42.  *
  43.  */
  44. #include <linux/delay.h>
  45. #include "sa1100_usb.h"  /* public interface */
  46. #include "usb_ctl.h"     /* private stuff */
  47. // 1 == lots of trace noise,  0 = only "important' stuff
  48. #define VERBOSITY 0
  49. enum { true = 1, false = 0 };
  50. typedef int bool;
  51. #ifndef MIN
  52. #define MIN( a, b ) ((a)<(b)?(a):(b))
  53. #endif
  54. #if 1 && !defined( ASSERT )
  55. #  define ASSERT(expr) 
  56.           if(!(expr)) { 
  57.           printk( "Assertion failed! %s,%s,%s,line=%dn",
  58.           #expr,__FILE__,__FUNCTION__,__LINE__); 
  59.           }
  60. #else
  61. #  define ASSERT(expr)
  62. #endif
  63. #if VERBOSITY
  64. #define PRINTKD(fmt, args...) printk( fmt , ## args)
  65. #else
  66. #define PRINTKD(fmt, args...)
  67. #endif
  68. /*================================================
  69.  * USB Protocol Stuff
  70.  */
  71. /* Request Codes   */
  72. enum { GET_STATUS=0,         CLEAR_FEATURE=1,     SET_FEATURE=3,
  73.    SET_ADDRESS=5,        GET_DESCRIPTOR=6,   SET_DESCRIPTOR=7,
  74.    GET_CONFIGURATION=8,  SET_CONFIGURATION=9, GET_INTERFACE=10,
  75.    SET_INTERFACE=11 };
  76. /* USB Device Requests */
  77. typedef struct
  78. {
  79.     __u8 bmRequestType;
  80.     __u8 bRequest;
  81.     __u16 wValue;
  82.     __u16 wIndex;
  83.     __u16 wLength;
  84. } usb_dev_request_t  __attribute__ ((packed));
  85. /***************************************************************************
  86. Prototypes
  87. ***************************************************************************/
  88. /* "setup handlers" -- the main functions dispatched to by the
  89.    .. isr. These represent the major "modes" of endpoint 0 operaton */
  90. static void sh_setup_begin(void); /* setup begin (idle) */
  91. static void sh_write( void );       /* writing data */
  92. static void sh_write_with_empty_packet( void ); /* empty packet at end of xfer*/
  93. /* called before both sh_write routines above */
  94. static void common_write_preamble( void );
  95. /* other subroutines */
  96. static __u32  queue_and_start_write( void * p, int req, int act );
  97. static void write_fifo( void );
  98. static int read_fifo( usb_dev_request_t * p );
  99. static void get_descriptor( usb_dev_request_t * pReq );
  100. /* some voodo helpers  01Mar01ww */
  101. static void set_cs_bits( __u32 set_bits );
  102. static void set_de( void );
  103. static void set_ipr( void );
  104. static void set_ipr_and_de( void );
  105. static bool clear_opr( void );
  106. /***************************************************************************
  107. Inline Helpers
  108. ***************************************************************************/
  109. /* Data extraction from usb_request_t fields */
  110. enum { kTargetDevice=0, kTargetInterface=1, kTargetEndpoint=2 };
  111. static inline int request_target( __u8 b ) { return (int) ( b & 0x0F); }
  112. static inline int windex_to_ep_num( __u16 w ) { return (int) ( w & 0x000F); }
  113. inline int type_code_from_request( __u8 by ) { return (( by >> 4 ) & 3); }
  114. /* following is hook for self-powered flag in GET_STATUS. Some devices
  115.    .. might like to override and return real info */
  116. static inline bool self_powered_hook( void ) { return true; }
  117. /* print string descriptor */
  118. static inline void psdesc( string_desc_t * p )
  119. {
  120.  int i;
  121.  int nchars = ( p->bLength - 2 ) / sizeof( __u16 );
  122.  printk( "'" );
  123.  for( i = 0 ; i < nchars ; i++ ) {
  124.   printk( "%c", (char) p->bString[i] );
  125.  }
  126.  printk( "'n" );
  127. }
  128. #if VERBOSITY
  129. /* "pcs" == "print control status" */
  130. static inline void pcs( void )
  131. {
  132.  __u32 foo = Ser0UDCCS0;
  133.  printk( "%8.8X: %s %s %s %sn",
  134.  foo,
  135.  foo & UDCCS0_SE ? "SE" : "",
  136.  foo & UDCCS0_OPR ? "OPR" : "",
  137.  foo & UDCCS0_IPR ? "IPR" : "",
  138.  foo & UDCCS0_SST ? "SST" : ""
  139.  );
  140. }
  141. static inline void preq( usb_dev_request_t * pReq )
  142. {
  143.  static char * tnames[] = { "dev", "intf", "ep", "oth" };
  144.  static char * rnames[] = { "std", "class", "vendor", "???" };
  145.  char * psz;
  146.  switch( pReq->bRequest ) {
  147.  case GET_STATUS: psz = "get stat"; break;
  148.  case CLEAR_FEATURE: psz = "clr feat"; break;
  149.  case SET_FEATURE: psz = "set feat"; break;
  150.  case SET_ADDRESS: psz = "set addr"; break;
  151.  case GET_DESCRIPTOR: psz = "get desc"; break;
  152.  case SET_DESCRIPTOR: psz = "set desc"; break;
  153.  case GET_CONFIGURATION: psz = "get cfg"; break;
  154.  case SET_CONFIGURATION: psz = "set cfg"; break;
  155.  case GET_INTERFACE: psz = "get intf"; break;
  156.  case SET_INTERFACE: psz = "set intf"; break;
  157.  default: psz = "unknown"; break;
  158.  }
  159.  printk( "- [%s: %s req to %s. dir=%s]n", psz,
  160.  rnames[ (pReq->bmRequestType >> 5) & 3 ],
  161.  tnames[ pReq->bmRequestType & 3 ],
  162.  ( pReq->bmRequestType & 0x80 ) ? "in" : "out" );
  163. }
  164. #else
  165. static inline void pcs( void ){}
  166. static inline void preq( void ){}
  167. #endif
  168. /***************************************************************************
  169. Globals
  170. ***************************************************************************/
  171. static const char pszMe[] = "usbep0: ";
  172. /* pointer to current setup handler */
  173. static void (*current_handler)(void) = sh_setup_begin;
  174. /* global write struct to keep write
  175.    ..state around across interrupts */
  176. static struct {
  177. unsigned char *p;
  178. int bytes_left;
  179. } wr;
  180. /***************************************************************************
  181. Public Interface
  182. ***************************************************************************/
  183. /* reset received from HUB (or controller just went nuts and reset by itself!)
  184.   so udc core has been reset, track this state here  */
  185. void
  186. ep0_reset(void)
  187. {
  188.  /* reset state machine */
  189.  current_handler = sh_setup_begin;
  190.  wr.p = NULL;
  191.  wr.bytes_left = 0;
  192.  usbd_info.address=0;
  193. }
  194. /* handle interrupt for endpoint zero */
  195. void
  196. ep0_int_hndlr( void )
  197. {
  198.  PRINTKD( "/\(%d)n", Ser0UDCAR );
  199.  pcs();
  200.  /* if not in setup begin, we are returning data.
  201. execute a common preamble to both write handlers
  202.  */
  203.  if ( current_handler != sh_setup_begin )
  204.   common_write_preamble();
  205.  (*current_handler)();
  206.  PRINTKD( "---n" );
  207.  pcs();
  208.  PRINTKD( "\/n" );
  209. }
  210. /***************************************************************************
  211. Setup Handlers
  212. ***************************************************************************/
  213. /*
  214.  * sh_setup_begin()
  215.  * This setup handler is the "idle" state of endpoint zero. It looks for OPR
  216.  * (OUT packet ready) to see if a setup request has been been received from the
  217.  * host. Requests without a return data phase are immediately handled. Otherwise,
  218.  * in the case of GET_XXXX the handler may be set to one of the sh_write_xxxx
  219.  * data pumpers if more than 8 bytes need to get back to the host.
  220.  *
  221.  */
  222. static void
  223. sh_setup_begin( void )
  224. {
  225.  unsigned char status_buf[2];  /* returned in GET_STATUS */
  226.  usb_dev_request_t req;
  227.  int request_type;
  228.  int n;
  229.  __u32 cs_bits;
  230.  __u32 address;
  231.  __u32 cs_reg_in = Ser0UDCCS0;
  232.  if (cs_reg_in & UDCCS0_SST) {
  233.   PRINTKD( "%ssetup begin: sent stall. Continuingn", pszMe );
  234.   set_cs_bits( UDCCS0_SST );
  235. }
  236.  if ( cs_reg_in & UDCCS0_SE ) {
  237.   PRINTKD( "%ssetup begin: Early term of setup. Continuingn", pszMe );
  238.   set_cs_bits( UDCCS0_SSE );    /* clear setup end */
  239.  }
  240.  /* Be sure out packet ready, otherwise something is wrong */
  241.  if ( (cs_reg_in & UDCCS0_OPR) == 0 ) {
  242.   /* we can get here early...if so, we'll int again in a moment  */
  243.   PRINTKD( "%ssetup begin: no OUT packet available. Exitingn", pszMe );
  244.   goto sh_sb_end;
  245.  }
  246.  /* read the setup request */
  247.  n = read_fifo( &req );
  248.  if ( n != sizeof( req ) ) {
  249.   printk( "%ssetup begin: fifo READ ERROR wanted %d bytes got %d. "
  250.   " Stalling out...n",
  251.   pszMe, sizeof( req ), n );
  252.   /* force stall, serviced out */
  253.   set_cs_bits( UDCCS0_FST | UDCCS0_SO  );
  254.   goto sh_sb_end;
  255.  }
  256.  /* Is it a standard request? (not vendor or class request) */
  257.  request_type = type_code_from_request( req.bmRequestType );
  258.  if ( request_type != 0 ) {
  259.   printk( "%ssetup begin: unsupported bmRequestType: %d ignoredn",
  260.   pszMe, request_type );
  261.   set_cs_bits( UDCCS0_DE | UDCCS0_SO );
  262.   goto sh_sb_end;
  263.  }
  264. #if VERBOSITY
  265.  {
  266.  unsigned char * pdb = (unsigned char *) &req;
  267.  PRINTKD( "%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X ",
  268.  pdb[0], pdb[1], pdb[2], pdb[3], pdb[4], pdb[5], pdb[6], pdb[7]
  269.   );
  270.  preq( &req );
  271.  }
  272. #endif
  273.  /* Handle it */
  274.  switch( req.bRequest ) {
  275.   /* This first bunch have no data phase */
  276.  case SET_ADDRESS:
  277.   address = (__u32) (req.wValue & 0x7F);
  278.   /* when SO and DE sent, UDC will enter status phase and ack,
  279.  ..propagating new address to udc core. Next control transfer
  280.  ..will be on the new address. You can't see the change in a
  281.  ..read back of CAR until then. (about 250us later, on my box).
  282.  ..The original Intel driver sets S0 and DE and code to check
  283.  ..that address has propagated here. I tried this, but it
  284.  ..would only work sometimes! The rest of the time it would
  285.  ..never propagate and we'd spin forever. So now I just set
  286.  ..it and pray...
  287.   */
  288.   Ser0UDCAR = address;
  289.   usbd_info.address = address;
  290.   usbctl_next_state_on_event( kEvAddress );
  291.   set_cs_bits( UDCCS0_SO | UDCCS0_DE );  /* no data phase */
  292.   printk( "%sI have been assigned address: %dn", pszMe, address );
  293.   break;
  294.  case SET_CONFIGURATION:
  295.   if ( req.wValue == 1 ) {
  296.    /* configured */
  297.    if (usbctl_next_state_on_event( kEvConfig ) != kError){
  298. /* (re)set the out and in max packet sizes */
  299. desc_t * pDesc = sa1100_usb_get_descriptor_ptr();
  300. __u32 out = __le16_to_cpu( pDesc->b.ep1.wMaxPacketSize );
  301. __u32 in  = __le16_to_cpu( pDesc->b.ep2.wMaxPacketSize );
  302. Ser0UDCOMP = ( out - 1 );
  303. Ser0UDCIMP = ( in - 1 );
  304. printk( "%sConfigured (OMP=%8.8X IMP=%8.8X)n", pszMe, out, in );
  305.    }
  306.   } else if ( req.wValue == 0 ) {
  307.    /* de-configured */
  308.    if (usbctl_next_state_on_event( kEvDeConfig ) != kError )
  309. printk( "%sDe-Configuredn", pszMe );
  310.   } else {
  311.    printk( "%ssetup phase: Unknown "
  312.    ""set configuration" data %dn",
  313.    pszMe, req.wValue );
  314.   }
  315.   set_cs_bits( UDCCS0_SO | UDCCS0_DE );  /* no data phase */
  316.   break;
  317.  case CLEAR_FEATURE:
  318.   /* could check data length, direction...26Jan01ww */
  319.   if ( req.wValue == 0 ) { /* clearing ENDPOINT_HALT/STALL */
  320.    int ep = windex_to_ep_num( req.wIndex );
  321.    if ( ep == 1 ) {
  322. printk( "%sclear feature "endpoint halt" "
  323. " on receivern", pszMe );
  324. ep1_reset();
  325.    }
  326.    else if ( ep == 2 ) {
  327. printk( "%sclear feature "endpoint halt" "
  328. "on xmittern", pszMe );
  329. ep2_reset();
  330.    } else {
  331. printk( "%sclear feature "endpoint halt" "
  332. "on unsupported ep # %dn",
  333. pszMe, ep );
  334.    }
  335.   } else {
  336.    printk( "%sUnsupported feature selector (%d) "
  337.    "in clear feature. Ignored.n" ,
  338.    pszMe, req.wValue );
  339.   }
  340.   set_cs_bits( UDCCS0_SO | UDCCS0_DE );  /* no data phase */
  341.   break;
  342.  case SET_FEATURE:
  343.   if ( req.wValue == 0 ) { /* setting ENDPOINT_HALT/STALL */
  344.    int ep = windex_to_ep_num( req.wValue );
  345.    if ( ep == 1 ) {
  346. printk( "%set feature "endpoint halt" "
  347. "on receivern", pszMe );
  348. ep1_stall();
  349.    }
  350.    else if ( ep == 2 ) {
  351. printk( "%sset feature "endpoint halt" "
  352. " on xmittern", pszMe );
  353. ep2_stall();
  354.    } else {
  355. printk( "%sset feature "endpoint halt" "
  356. "on unsupported ep # %dn",
  357. pszMe, ep );
  358.    }
  359.   }
  360.   else {
  361.    printk( "%sUnsupported feature selector "
  362.    "(%d) in set featuren",
  363.    pszMe, req.wValue );
  364.   }
  365.   set_cs_bits( UDCCS0_SO | UDCCS0_DE );  /* no data phase */
  366.   break;
  367.   /* The rest have a data phase that writes back to the host */
  368.  case GET_STATUS:
  369.   /* return status bit flags */
  370.   status_buf[0] = status_buf[1] = 0;
  371.   n = request_target(req.bmRequestType);
  372.   switch( n ) {
  373.   case kTargetDevice:
  374.    if ( self_powered_hook() )
  375. status_buf[0] |= 1;
  376.    break;
  377.   case kTargetInterface:
  378.    break;
  379.   case kTargetEndpoint:
  380.    /* return stalled bit */
  381.    n = windex_to_ep_num( req.wIndex );
  382.    if ( n == 1 )
  383. status_buf[0] |= (Ser0UDCCS1 & UDCCS1_FST) >> 4;
  384.    else if ( n == 2 )
  385. status_buf[0] |= (Ser0UDCCS2 & UDCCS2_FST) >> 5;
  386.    else {
  387. printk( "%sUnknown endpoint (%d) "
  388. "in GET_STATUSn", pszMe, n );
  389.    }
  390.    break;
  391.   default:
  392.    printk( "%sUnknown target (%d) in GET_STATUSn",
  393.    pszMe, n );
  394.    /* fall thru */
  395.    break;
  396.   }
  397.   cs_bits  = queue_and_start_write( status_buf,
  398. req.wLength,
  399. sizeof( status_buf ) );
  400.   set_cs_bits( cs_bits );
  401.   break;
  402.  case GET_DESCRIPTOR:
  403.   get_descriptor( &req );
  404.   break;
  405.  case GET_CONFIGURATION:
  406.   status_buf[0] = (usbd_info.state ==  USB_STATE_CONFIGURED)
  407.    ? 1
  408.    : 0;
  409.   cs_bits = queue_and_start_write( status_buf, req.wLength, 1 );
  410.   set_cs_bits( cs_bits );
  411.   break;
  412.  case GET_INTERFACE:
  413.   printk( "%sfixme: get interface not supportedn", pszMe );
  414.   cs_bits = queue_and_start_write( NULL, req.wLength, 0 );
  415.   set_cs_bits( cs_bits );
  416.   break;
  417.  case SET_INTERFACE:
  418.   printk( "%sfixme: set interface not supportedn", pszMe );
  419.   set_cs_bits( UDCCS0_DE | UDCCS0_SO );
  420.   break;
  421.  default :
  422.   printk("%sunknown request 0x%xn", pszMe, req.bRequest);
  423.   break;
  424.  } /* switch( bRequest ) */
  425. sh_sb_end:
  426.  return;
  427. }
  428. /*
  429.  * common_wrtie_preamble()
  430.  * Called before execution of sh_write() or sh_write_with_empty_packet()
  431.  * Handles common abort conditions.
  432.  *
  433.  */
  434. static void common_write_preamble( void )
  435. {
  436.  /* If "setup end" has been set, the usb controller has
  437. ..terminated a setup transaction before we set DE. This
  438. ..happens during enumeration with some hosts. For example,
  439. ..the host will ask for our device descriptor and specify
  440. ..a return of 64 bytes. When we hand back the first 8, the
  441. ..host will know our max packet size and turn around and
  442. ..issue a new setup immediately. This causes the UDC to auto-ack
  443. ..the new setup and set SE. We must then "unload" (process)
  444. ..the new setup, which is what will happen after this preamble
  445. ..is finished executing.
  446.  */
  447.  __u32 cs_reg_in = Ser0UDCCS0;
  448.  if ( cs_reg_in & UDCCS0_SE ) {
  449.   PRINTKD( "%swrite_preamble(): Early termination of setupn", pszMe );
  450.   Ser0UDCCS0 =  UDCCS0_SSE;    /* clear setup end */
  451.   current_handler = sh_setup_begin;
  452.  }
  453.  if ( cs_reg_in & UDCCS0_SST ) {
  454.   PRINTKD( "%swrite_preamble(): UDC sent stalln", pszMe );
  455.   Ser0UDCCS0 = UDCCS0_SST;    /* clear setup end */
  456.   current_handler = sh_setup_begin;
  457.  }
  458.  if ( cs_reg_in & UDCCS0_OPR ) {
  459.   PRINTKD( "%swrite_preamble(): see OPR. Stopping write to "
  460.    "handle new SETUPn", pszMe );
  461.   /* very rarely, you can get OPR and leftover IPR. Try to clear */
  462.   UDC_clear( Ser0UDCCS0, UDCCS0_IPR );
  463.   current_handler = sh_setup_begin;
  464.  }
  465. }
  466. /*
  467.  * sh_write()
  468.  * This is the setup handler when we are in the data return phase of
  469.  * a setup request and have as much (or more) data than the host
  470.  * requested. If we enter this routine and bytes left is zero, the
  471.  * last data packet has gone (int is because IPR was just cleared)
  472.  * so we just set DE and reset. Otheriwse, we write another packet
  473.  * and set IPR.
  474.  */
  475. static void sh_write()
  476. {
  477.  PRINTKD( "Wn" );
  478.  if ( Ser0UDCCS0 & UDCCS0_IPR ) {
  479.   PRINTKD( "%ssh_write(): IPR set, exitingn", pszMe );
  480.   return;
  481.  }
  482.  /* If bytes left is zero, we are coming in on the
  483. ..interrupt after the last packet went out. And
  484. ..we know we don't have to empty packet this transfer
  485. ..so just set DE and we are done */
  486.  if ( 0 == wr.bytes_left ) {
  487.   /* that's it, so data end  */
  488.   set_de();
  489.   wr.p = NULL;   /* be anal */
  490.   current_handler = sh_setup_begin;
  491.  } else {
  492.   /* Otherwise, more data to go */
  493.   write_fifo();
  494.   set_ipr();
  495.  }
  496. }
  497. /*
  498.  * sh_write_with_empty_packet()
  499.  * This is the setup handler when we don't have enough data to
  500.  * satisfy the host's request. After we send everything we've got
  501.  * we must send an empty packet (by setting IPR and DE) so the
  502.  * host can perform "short packet retirement" and not stall.
  503.  *
  504.  */
  505. static void sh_write_with_empty_packet( void )
  506. {
  507.  __u32 cs_reg_out = 0;
  508.  PRINTKD( "WEn" );
  509.  if ( Ser0UDCCS0 & UDCCS0_IPR ) {
  510.   PRINTKD( "%ssh_write(): IPR set, exitingn", pszMe );
  511.   return;
  512.  }
  513.  /* If bytes left is zero, we are coming in on the
  514. ..interrupt after the last packet went out.
  515. ..we must do short packet suff, so set DE and IPR
  516.  */
  517.  if ( 0 == wr.bytes_left ) {
  518.   set_ipr_and_de();
  519.   wr.p = NULL;
  520.   current_handler = sh_setup_begin;
  521.   PRINTKD( "%ssh_write empty() Sent empty packet n", pszMe );
  522.  }  else {
  523.   write_fifo(); /* send data */
  524.   set_ipr(); /* flag a packet is ready */
  525.  }
  526.  Ser0UDCCS0 = cs_reg_out;
  527. }
  528. /***************************************************************************
  529. Other Private Subroutines
  530. ***************************************************************************/
  531. /*
  532.  * queue_and_start_write()
  533.  * p == data to send
  534.  * req == bytes host requested
  535.  * act == bytes we actually have
  536.  * Returns: bits to be flipped in ep0 control/status register
  537.  *
  538.  * Called from sh_setup_begin() to begin a data return phase. Sets up the
  539.  * global "wr"-ite structure and load the outbound FIFO with data.
  540.  * If can't send all the data, set appropriate handler for next interrupt.
  541.  *
  542.  */
  543. static __u32  queue_and_start_write( void * in, int req, int act )
  544. {
  545.  __u32 cs_reg_bits = UDCCS0_IPR;
  546.  unsigned char * p = (unsigned char*) in;
  547.  PRINTKD( "Qr=%d a=%dn",req,act );
  548. /* thou shalt not enter data phase until the serviced OUT is clear */
  549.  if ( ! clear_opr() ) {
  550.   printk( "%sSO did not clear OPRn", pszMe );
  551.   return ( UDCCS0_DE | UDCCS0_SO ) ;
  552.  }
  553.  wr.p = p;
  554.  wr.bytes_left = MIN( act, req );
  555.  write_fifo();
  556.  if ( 0 == wr.bytes_left ) {
  557.   cs_reg_bits |= UDCCS0_DE; /* out in 1 so data end */
  558.   wr.p = NULL;   /* be anal */
  559.  }
  560.  else if ( act < req )   /* we are going to short-change host */
  561.   current_handler = sh_write_with_empty_packet; /* so need nul to not stall */
  562.  else /* we have as much or more than requested */
  563.   current_handler = sh_write;
  564.  return cs_reg_bits; /* note: IPR was set uncondtionally at start of routine */
  565. }
  566. /*
  567.  * write_fifo()
  568.  * Stick bytes in the 8 bytes endpoint zero FIFO.
  569.  * This version uses a variety of tricks to make sure the bytes
  570.  * are written correctly. 1. The count register is checked to
  571.  * see if the byte went in, and the write is attempted again
  572.  * if not. 2. An overall counter is used to break out so we
  573.  * don't hang in those (rare) cases where the UDC reverses
  574.  * direction of the FIFO underneath us without notification
  575.  * (in response to host aborting a setup transaction early).
  576.  *
  577.  */
  578. static void write_fifo( void )
  579. {
  580. int bytes_this_time = MIN( wr.bytes_left, 8 );
  581. int bytes_written = 0;
  582. int i=0;
  583. PRINTKD( "WF=%d: ", bytes_this_time );
  584. while( bytes_this_time-- ) {
  585.  PRINTKD( "%2.2X ", *wr.p );
  586.  i = 0;
  587.  do {
  588.   Ser0UDCD0 = *wr.p;
  589.   udelay( 20 );  /* voodo 28Feb01ww */
  590.   i++;
  591.  } while( Ser0UDCWC == bytes_written && i < 10 );
  592.  if ( i == 50 ) {
  593.   printk( "%swrite_fifo: write failuren", pszMe );
  594.   usbd_info.stats.ep0_fifo_write_failures++;
  595.  }
  596.  wr.p++;
  597.  bytes_written++;
  598. }
  599. wr.bytes_left -= bytes_written;
  600. /* following propagation voodo so maybe caller writing IPR in
  601.    ..a moment might actually get it to stick 28Feb01ww */
  602. udelay( 300 );
  603. usbd_info.stats.ep0_bytes_written += bytes_written;
  604. PRINTKD( "L=%d WCR=%8.8Xn", wr.bytes_left, Ser0UDCWC );
  605. }
  606. /*
  607.  * read_fifo()
  608.  * Read 1-8 bytes out of FIFO and put in request.
  609.  * Called to do the initial read of setup requests
  610.  * from the host. Return number of bytes read.
  611.  *
  612.  * Like write fifo above, this driver uses multiple
  613.  * reads checked agains the count register with an
  614.  * overall timeout.
  615.  *
  616.  */
  617. static int
  618. read_fifo( usb_dev_request_t * request )
  619. {
  620. int bytes_read = 0;
  621. int fifo_count;
  622. int i;
  623. unsigned char * pOut = (unsigned char*) request;
  624. fifo_count = ( Ser0UDCWC & 0xFF );
  625. ASSERT( fifo_count <= 8 );
  626. PRINTKD( "RF=%d ", fifo_count );
  627. while( fifo_count-- ) {
  628.  i = 0;
  629.  do {
  630.   *pOut = (unsigned char) Ser0UDCD0;
  631.   udelay( 10 );
  632.  } while( ( Ser0UDCWC & 0xFF ) != fifo_count && i < 10 );
  633.  if ( i == 10 ) {
  634.   printk( "%sread_fifo(): read failuren", pszMe );
  635.   usbd_info.stats.ep0_fifo_read_failures++;
  636.  }
  637.  pOut++;
  638.  bytes_read++;
  639. }
  640. PRINTKD( "fc=%dn", bytes_read );
  641. usbd_info.stats.ep0_bytes_read++;
  642. return bytes_read;
  643. }
  644. /*
  645.  * get_descriptor()
  646.  * Called from sh_setup_begin to handle data return
  647.  * for a GET_DESCRIPTOR setup request.
  648.  */
  649. static void get_descriptor( usb_dev_request_t * pReq )
  650. {
  651.  __u32 cs_bits = 0;
  652.  string_desc_t * pString;
  653.  ep_desc_t * pEndpoint;
  654.  desc_t * pDesc = sa1100_usb_get_descriptor_ptr();
  655.  int type = pReq->wValue >> 8;
  656.  int idx  = pReq->wValue & 0xFF;
  657.  switch( type ) {
  658.  case USB_DESC_DEVICE:
  659.   cs_bits =
  660.    queue_and_start_write( &pDesc->dev,
  661.   pReq->wLength,
  662.   pDesc->dev.bLength );
  663.   break;
  664.   // return config descriptor buffer, cfg, intf, 2 ep
  665.  case USB_DESC_CONFIG:
  666.   cs_bits =
  667.    queue_and_start_write( &pDesc->b,
  668.   pReq->wLength,
  669.   sizeof( struct cdb ) );
  670.   break;
  671.   // not quite right, since doesn't do language code checking
  672.  case USB_DESC_STRING:
  673.   pString = sa1100_usb_get_string_descriptor( idx );
  674.   if ( pString ) {
  675.    if ( idx != 0 ) {  // if not language index
  676. printk( "%sReturn string %d: ", pszMe, idx );
  677. psdesc( pString );
  678.    }
  679.    cs_bits =
  680. queue_and_start_write( pString,
  681.    pReq->wLength,
  682.    pString->bLength );
  683.   }
  684.   else {
  685.    printk("%sunkown string index %d Stall.n", pszMe, idx );
  686.    cs_bits = ( UDCCS0_DE | UDCCS0_SO | UDCCS0_FST );
  687.   }
  688.   break;
  689.  case USB_DESC_INTERFACE:
  690.   if ( idx == pDesc->b.intf.bInterfaceNumber ) {
  691.    cs_bits =
  692. queue_and_start_write( &pDesc->b.intf,
  693.    pReq->wLength,
  694.    pDesc->b.intf.bLength );
  695.   }
  696.   break;
  697.  case USB_DESC_ENDPOINT: /* correct? 21Feb01ww */
  698.   if ( idx == 1 )
  699.    pEndpoint = &pDesc->b.ep1;
  700.   else if ( idx == 2 )
  701.    pEndpoint = &pDesc->b.ep2;
  702.   else
  703.    pEndpoint = NULL;
  704.   if ( pEndpoint ) {
  705.    cs_bits =
  706. queue_and_start_write( pEndpoint,
  707.    pReq->wLength,
  708.    pEndpoint->bLength );
  709.   } else {
  710.    printk("%sunkown endpoint index %d Stall.n", pszMe, idx );
  711.    cs_bits = ( UDCCS0_DE | UDCCS0_SO | UDCCS0_FST );
  712.   }
  713.   break;
  714.  default :
  715.   printk("%sunknown descriptor type %d. Stall.n", pszMe, type );
  716.   cs_bits = ( UDCCS0_DE | UDCCS0_SO | UDCCS0_FST );
  717.   break;
  718.  }
  719.  set_cs_bits( cs_bits );
  720. }
  721. /* some voodo I am adding, since the vanilla macros just aren't doing it  1Mar01ww */
  722. #define ABORT_BITS ( UDCCS0_SST | UDCCS0_SE )
  723. #define OK_TO_WRITE (!( Ser0UDCCS0 & ABORT_BITS ))
  724. #define BOTH_BITS (UDCCS0_IPR | UDCCS0_DE)
  725. static void set_cs_bits( __u32 bits )
  726. {
  727.  if ( bits & ( UDCCS0_SO | UDCCS0_SSE | UDCCS0_FST ) )
  728.   Ser0UDCCS0 = bits;
  729.  else if ( (bits & BOTH_BITS) == BOTH_BITS )
  730.   set_ipr_and_de();
  731.  else if ( bits & UDCCS0_IPR )
  732.   set_ipr();
  733.  else if ( bits & UDCCS0_DE )
  734.   set_de();
  735. }
  736. static void set_de( void )
  737. {
  738.  int i = 1;
  739.  while( 1 ) {
  740.   if ( OK_TO_WRITE ) {
  741. Ser0UDCCS0 |= UDCCS0_DE;
  742.   } else {
  743.    PRINTKD( "%sQuitting set DE because SST or SE setn", pszMe );
  744.    break;
  745.   }
  746.   if ( Ser0UDCCS0 & UDCCS0_DE )
  747.    break;
  748.   udelay( i );
  749.   if ( ++i == 50  ) {
  750.    printk( "%sDangnabbbit! Cannot set DE! (DE=%8.8X CCS0=%8.8X)n",
  751.    pszMe, UDCCS0_DE, Ser0UDCCS0 );
  752.    break;
  753.   }
  754.  }
  755. }
  756. static void set_ipr( void )
  757. {
  758.  int i = 1;
  759.  while( 1 ) {
  760.   if ( OK_TO_WRITE ) {
  761. Ser0UDCCS0 |= UDCCS0_IPR;
  762.   } else {
  763.    PRINTKD( "%sQuitting set IPR because SST or SE setn", pszMe );
  764.    break;
  765.   }
  766.   if ( Ser0UDCCS0 & UDCCS0_IPR )
  767.    break;
  768.   udelay( i );
  769.   if ( ++i == 50  ) {
  770.    printk( "%sDangnabbbit! Cannot set IPR! (IPR=%8.8X CCS0=%8.8X)n",
  771.    pszMe, UDCCS0_IPR, Ser0UDCCS0 );
  772.    break;
  773.   }
  774.  }
  775. }
  776. static void set_ipr_and_de( void )
  777. {
  778.  int i = 1;
  779.  while( 1 ) {
  780.   if ( OK_TO_WRITE ) {
  781.    Ser0UDCCS0 |= BOTH_BITS;
  782.   } else {
  783.    PRINTKD( "%sQuitting set IPR/DE because SST or SE setn", pszMe );
  784.    break;
  785.   }
  786.   if ( (Ser0UDCCS0 & BOTH_BITS) == BOTH_BITS)
  787.    break;
  788.   udelay( i );
  789.   if ( ++i == 50  ) {
  790.    printk( "%sDangnabbbit! Cannot set DE/IPR! (DE=%8.8X IPR=%8.8X CCS0=%8.8X)n",
  791.    pszMe, UDCCS0_DE, UDCCS0_IPR, Ser0UDCCS0 );
  792.    break;
  793.   }
  794.  }
  795. }
  796. static bool clear_opr( void )
  797. {
  798.  int i = 10000;
  799.  bool is_clear;
  800.  do {
  801.   Ser0UDCCS0 = UDCCS0_SO;
  802.   is_clear  = ! ( Ser0UDCCS0 & UDCCS0_OPR );
  803.   if ( i-- <= 0 ) {
  804.    printk( "%sclear_opr(): failedn", pszMe );
  805.    break;
  806.   }
  807.  } while( ! is_clear );
  808.  return is_clear;
  809. }
  810. /* end usb_ep0.c */