st5481_usb.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Driver for ST5481 USB ISDN modem
  3.  *
  4.  * Author       Frode Isaksen
  5.  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  6.  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
  7.  * 
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  *
  11.  */
  12. #include <linux/init.h>
  13. #include <linux/usb.h>
  14. #include <linux/slab.h>
  15. #include "st5481.h"
  16. /* ======================================================================
  17.  * control pipe
  18.  */
  19. /*
  20.  * Send the next endpoint 0 request stored in the FIFO.
  21.  * Called either by the completion or by usb_ctrl_msg.
  22.  */
  23. static void usb_next_ctrl_msg(struct urb *urb,
  24.       struct st5481_adapter *adapter)
  25. {
  26. struct st5481_ctrl *ctrl = &adapter->ctrl;
  27. int r_index;
  28. if (test_and_set_bit(0, &ctrl->busy)) {
  29. return;
  30. }
  31. if ((r_index = fifo_remove(&ctrl->msg_fifo.f)) < 0) {
  32. test_and_clear_bit(0,&ctrl->busy);
  33. return;
  34. urb->setup_packet = 
  35. (unsigned char *)&ctrl->msg_fifo.data[r_index];
  36. DBG(1,"request=0x%02x,value=0x%04x,index=%x",
  37.     ((struct ctrl_msg *)urb->setup_packet)->dr.bRequest,
  38.     ((struct ctrl_msg *)urb->setup_packet)->dr.wValue,
  39.     ((struct ctrl_msg *)urb->setup_packet)->dr.wIndex);
  40. // Prepare the URB
  41. urb->dev = adapter->usb_dev;
  42. SUBMIT_URB(urb);
  43. }
  44. /*
  45.  * Asynchronous endpoint 0 request (async version of usb_control_msg).
  46.  * The request will be queued up in a FIFO if the endpoint is busy.
  47.  */
  48. void usb_ctrl_msg(struct st5481_adapter *adapter,
  49.   u8 request, u8 requesttype, u16 value, u16 index,
  50.   ctrl_complete_t complete, void *context)
  51. {
  52. struct st5481_ctrl *ctrl = &adapter->ctrl;
  53. int w_index;
  54. struct ctrl_msg *ctrl_msg;
  55. if ((w_index = fifo_add(&ctrl->msg_fifo.f)) < 0) {
  56. WARN("control msg FIFO full");
  57. return;
  58. }
  59. ctrl_msg = &ctrl->msg_fifo.data[w_index]; 
  60.    
  61. ctrl_msg->dr.bRequestType = requesttype;
  62. ctrl_msg->dr.bRequest = request;
  63. ctrl_msg->dr.wValue = cpu_to_le16p(&value);
  64. ctrl_msg->dr.wIndex = cpu_to_le16p(&index);
  65. ctrl_msg->dr.wLength = 0;
  66. ctrl_msg->complete = complete;
  67. ctrl_msg->context = context;
  68. usb_next_ctrl_msg(ctrl->urb, adapter);
  69. }
  70. /*
  71.  * Asynchronous endpoint 0 device request.
  72.  */
  73. void st5481_usb_device_ctrl_msg(struct st5481_adapter *adapter,
  74.  u8 request, u16 value,
  75.  ctrl_complete_t complete, void *context)
  76. {
  77. usb_ctrl_msg(adapter, request, 
  78.      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 
  79.      value, 0, complete, context);
  80. }
  81. /*
  82.  * Asynchronous pipe reset (async version of usb_clear_halt).
  83.  */
  84. void st5481_usb_pipe_reset(struct st5481_adapter *adapter,
  85.     u_char pipe,
  86.     ctrl_complete_t complete, void *context)
  87. {
  88. DBG(1,"pipe=%02x",pipe);
  89. usb_ctrl_msg(adapter,
  90.      USB_REQ_CLEAR_FEATURE, USB_DIR_OUT | USB_RECIP_ENDPOINT,
  91.      0, pipe, complete, context);
  92. }
  93. /*
  94.   Physical level functions
  95. */
  96. void st5481_ph_command(struct st5481_adapter *adapter, unsigned int command)
  97. {
  98. DBG(8,"command=%s", ST5481_CMD_string(command));
  99. st5481_usb_device_ctrl_msg(adapter, TXCI, command, NULL, NULL);
  100. }
  101. /*
  102.  * The request on endpoint 0 has completed.
  103.  * Call the user provided completion routine and try
  104.  * to send the next request.
  105.  */
  106. static void usb_ctrl_complete(struct urb *urb)
  107. {
  108. struct st5481_adapter *adapter = urb->context;
  109. struct st5481_ctrl *ctrl = &adapter->ctrl;
  110. struct ctrl_msg *ctrl_msg;
  111. if (urb->status < 0) {
  112. if (urb->status != USB_ST_URB_KILLED) {
  113. WARN("urb status %d",urb->status);
  114. } else {
  115. DBG(1,"urb killed");
  116. return; // Give up
  117. }
  118. }
  119. ctrl_msg = (struct ctrl_msg *)urb->setup_packet;
  120. if (ctrl_msg->dr.bRequest == USB_REQ_CLEAR_FEATURE) {
  121.         /* Special case handling for pipe reset */
  122. le16_to_cpus(&ctrl_msg->dr.wIndex);
  123. usb_endpoint_running(adapter->usb_dev,
  124.      ctrl_msg->dr.wIndex & ~USB_DIR_IN, 
  125.      (ctrl_msg->dr.wIndex & USB_DIR_IN) == 0);
  126. /* toggle is reset on clear */
  127. usb_settoggle(adapter->usb_dev, 
  128.       ctrl_msg->dr.wIndex & ~USB_DIR_IN, 
  129.       (ctrl_msg->dr.wIndex & USB_DIR_IN) == 0,
  130.       0);
  131. }
  132. if (ctrl_msg->complete)
  133. ctrl_msg->complete(ctrl_msg->context);
  134. clear_bit(0, &ctrl->busy);
  135. // Try to send next control message
  136. usb_next_ctrl_msg(urb, adapter);
  137. return;
  138. }
  139. /* ======================================================================
  140.  * interrupt pipe
  141.  */
  142. /*
  143.  * The interrupt endpoint will be called when any
  144.  * of the 6 registers changes state (depending on masks).
  145.  * Decode the register values and schedule a private event.
  146.  * Called at interrupt.
  147.  */
  148. static void usb_int_complete(struct urb *urb)
  149. {
  150. u_char *data = urb->transfer_buffer;
  151. u_char irqbyte;
  152. struct st5481_adapter *adapter = urb->context;
  153. int j;
  154. if (urb->status < 0) {
  155. if (urb->status != USB_ST_URB_KILLED) {
  156. WARN("urb status %d",urb->status);
  157. urb->actual_length = 0;
  158. } else {
  159. DBG(1,"urb killed");
  160. return; // Give up
  161. }
  162. }
  163. DBG_PACKET(1, data, INT_PKT_SIZE);
  164. if (urb->actual_length == 0) {
  165. return;
  166. }
  167. irqbyte = data[MPINT];
  168. if (irqbyte & DEN_INT)
  169. FsmEvent(&adapter->d_out.fsm, EV_DOUT_DEN, NULL);
  170. if (irqbyte & DCOLL_INT)
  171. FsmEvent(&adapter->d_out.fsm, EV_DOUT_COLL, NULL);
  172. irqbyte = data[FFINT_D];
  173. if (irqbyte & OUT_UNDERRUN)
  174. FsmEvent(&adapter->d_out.fsm, EV_DOUT_UNDERRUN, NULL);
  175. if (irqbyte & OUT_DOWN)
  176. ;// printk("OUT_DOWNn");
  177. irqbyte = data[MPINT];
  178. if (irqbyte & RXCI_INT)
  179. FsmEvent(&adapter->l1m, data[CCIST] & 0x0f, NULL);
  180. for (j = 0; j < 2; j++)
  181. adapter->bcs[j].b_out.flow_event |= data[FFINT_B1 + j];
  182. urb->actual_length = 0;
  183. }
  184. /* ======================================================================
  185.  * initialization
  186.  */
  187. int __devinit st5481_setup_usb(struct st5481_adapter *adapter)
  188. {
  189. struct usb_device *dev = adapter->usb_dev;
  190. struct st5481_ctrl *ctrl = &adapter->ctrl;
  191. struct st5481_intr *intr = &adapter->intr;
  192. struct usb_interface_descriptor *altsetting;
  193. struct usb_endpoint_descriptor *endpoint;
  194. int status;
  195. struct urb *urb;
  196. u_char *buf;
  197. DBG(1,"");
  198. if ((status = usb_set_configuration (dev,dev->config[0].bConfigurationValue)) < 0) {
  199. WARN("set_configuration failed,status=%d",status);
  200. return status;
  201. }
  202. altsetting = &(dev->config->interface[0].altsetting[3]);
  203. // Check if the config is sane
  204. if ( altsetting->bNumEndpoints != 7 ) {
  205. WARN("expecting 7 got %d endpoints!", altsetting->bNumEndpoints);
  206. return -EINVAL;
  207. }
  208. // The descriptor is wrong for some early samples of the ST5481 chip
  209. altsetting->endpoint[3].wMaxPacketSize = 32;
  210. altsetting->endpoint[4].wMaxPacketSize = 32;
  211. // Use alternative setting 3 on interface 0 to have 2B+D
  212. if ((status = usb_set_interface (dev, 0, 3)) < 0) {
  213. WARN("usb_set_interface failed,status=%d",status);
  214. return status;
  215. }
  216. // Allocate URB for control endpoint
  217. urb = usb_alloc_urb(0);
  218. if (!urb) {
  219. return -ENOMEM;
  220. }
  221. ctrl->urb = urb;
  222. // Fill the control URB
  223. FILL_CONTROL_URB (urb, dev, 
  224.   usb_sndctrlpipe(dev, 0),
  225.   NULL, NULL, 0, usb_ctrl_complete, adapter);
  226. fifo_init(&ctrl->msg_fifo.f, ARRAY_SIZE(ctrl->msg_fifo.data));
  227. // Allocate URBs and buffers for interrupt endpoint
  228. urb = usb_alloc_urb(0);
  229. if (!urb) { 
  230. return -ENOMEM;
  231. }
  232. intr->urb = urb;
  233. buf = kmalloc(INT_PKT_SIZE, GFP_KERNEL);
  234. if (!buf) {
  235. return -ENOMEM;
  236. }
  237. endpoint = &altsetting->endpoint[EP_INT-1];
  238. // Fill the interrupt URB
  239. FILL_INT_URB(urb, dev,
  240.      usb_rcvintpipe(dev, endpoint->bEndpointAddress),
  241.      buf, INT_PKT_SIZE,
  242.      usb_int_complete, adapter,
  243.      endpoint->bInterval);
  244. return 0;
  245. }
  246. /*
  247.  * Release buffers and URBs for the interrupt and control
  248.  * endpoint.
  249.  */
  250. void st5481_release_usb(struct st5481_adapter *adapter)
  251. {
  252. struct st5481_intr *intr = &adapter->intr;
  253. struct st5481_ctrl *ctrl = &adapter->ctrl;
  254. DBG(1,"");
  255. // Stop and free Control and Interrupt URBs
  256. usb_unlink_urb(ctrl->urb);
  257. if (ctrl->urb->transfer_buffer)
  258. kfree(ctrl->urb->transfer_buffer);
  259. usb_free_urb(ctrl->urb);
  260. usb_unlink_urb(intr->urb);
  261. if (intr->urb->transfer_buffer)
  262. kfree(intr->urb->transfer_buffer);
  263. usb_free_urb(intr->urb);
  264. }
  265. /*
  266.  *  Initialize the adapter.
  267.  */
  268. void __devinit st5481_start(struct st5481_adapter *adapter)
  269. {
  270. static const u8 init_cmd_table[]={
  271. SET_DEFAULT,0,
  272. STT,0,
  273. SDA_MIN,0x0d,
  274. SDA_MAX,0x29,
  275. SDELAY_VALUE,0x14,
  276. GPIO_DIR,0x01,
  277. GPIO_OUT,RED_LED,
  278. // FFCTRL_OUT_D,4,
  279. // FFCTRH_OUT_D,12,
  280. FFCTRL_OUT_B1,6,
  281. FFCTRH_OUT_B1,20,
  282. FFCTRL_OUT_B2,6,
  283. FFCTRH_OUT_B2,20,
  284. MPMSK,RXCI_INT+DEN_INT+DCOLL_INT,
  285. 0
  286. };
  287. struct st5481_intr *intr = &adapter->intr;
  288. int i = 0;
  289. u8 request,value;
  290. DBG(8,"");
  291. adapter->leds = RED_LED; 
  292. // Start receiving on the interrupt endpoint
  293. SUBMIT_URB(intr->urb); 
  294. while ((request = init_cmd_table[i++])) {
  295. value = init_cmd_table[i++];
  296. st5481_usb_device_ctrl_msg(adapter, request, value, NULL, NULL);
  297. }
  298. st5481_ph_command(adapter, ST5481_CMD_PUP);
  299. }
  300. /*
  301.  * Reset the adapter to default values.
  302.  */
  303. void __devexit st5481_stop(struct st5481_adapter *adapter)
  304. {
  305. DBG(8,"");
  306. st5481_usb_device_ctrl_msg(adapter, SET_DEFAULT, 0, NULL, NULL);
  307. }
  308. /* ======================================================================
  309.  * isochronous USB  helpers
  310.  */
  311. static void __devinit
  312. fill_isoc_urb(struct urb *urb, struct usb_device *dev,
  313.       unsigned int pipe, void *buf, int num_packets, 
  314.       int packet_size, usb_complete_t complete,
  315.       void *context) 
  316. {
  317. int k;
  318. spin_lock_init(&urb->lock);
  319. urb->dev=dev;
  320. urb->pipe=pipe;
  321. urb->transfer_buffer=buf;
  322. urb->number_of_packets = num_packets;
  323. urb->transfer_buffer_length=num_packets*packet_size;
  324. urb->actual_length = 0;
  325. urb->complete=complete;
  326. urb->context=context;
  327. urb->transfer_flags=USB_ISO_ASAP;
  328. for (k = 0; k < num_packets; k++) {
  329. urb->iso_frame_desc[k].offset = packet_size * k;
  330. urb->iso_frame_desc[k].length = packet_size;
  331. urb->iso_frame_desc[k].actual_length = 0;
  332. }
  333. }
  334. int __devinit
  335. st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev, 
  336.    unsigned int pipe, int num_packets,
  337.    int packet_size, int buf_size,
  338.    usb_complete_t complete, void *context)
  339. {
  340. int j, retval;
  341. unsigned char *buf;
  342. for (j = 0; j < 2; j++) {
  343. retval = -ENOMEM;
  344. urb[j] = usb_alloc_urb(num_packets);
  345. if (!urb[j])
  346. goto err;
  347. // Allocate memory for 2000bytes/sec (16Kb/s)
  348. buf = kmalloc(buf_size, GFP_KERNEL);
  349. if (!buf)
  350. goto err;
  351. // Fill the isochronous URB
  352. fill_isoc_urb(urb[j], dev, pipe, buf, 
  353.       num_packets, packet_size, complete,
  354.       context);
  355. }
  356. return 0;
  357.  err:
  358. for (j = 0; j < 2; j++) {
  359. if (urb[j]) {
  360. if (urb[j]->transfer_buffer)
  361. kfree(urb[j]->transfer_buffer);
  362. usb_free_urb(urb[j]);
  363. }
  364. }
  365. return retval;
  366. }
  367. void st5481_release_isocpipes(struct urb* urb[2])
  368. {
  369. int j;
  370. for (j = 0; j < 2; j++) {
  371. usb_unlink_urb(urb[j]);
  372. if (urb[j]->transfer_buffer)
  373. kfree(urb[j]->transfer_buffer);
  374. usb_free_urb(urb[j]);
  375. }
  376. }
  377. /*
  378.  * Decode frames received on the B/D channel.
  379.  * Note that this function will be called continously
  380.  * with 64Kbit/s / 16Kbit/s of data and hence it will be 
  381.  * called 50 times per second with 20 ISOC descriptors. 
  382.  * Called at interrupt.
  383.  */
  384. static void usb_in_complete(struct urb *urb)
  385. {
  386. struct st5481_in *in = urb->context;
  387. unsigned char *ptr;
  388. struct sk_buff *skb;
  389. int len, count, status;
  390. if (urb->status < 0) {
  391. if (urb->status != USB_ST_URB_KILLED) {
  392. WARN("urb status %d",urb->status);
  393. } else {
  394. DBG(1,"urb killed");
  395. return; // Give up
  396. }
  397. }
  398. DBG_ISO_PACKET(0x80,urb);
  399. len = st5481_isoc_flatten(urb);
  400. ptr = urb->transfer_buffer;
  401. while (len > 0) {
  402. if (in->mode == L1_MODE_TRANS) {
  403. memcpy(in->rcvbuf, ptr, len);
  404. status = len;
  405. len = 0;
  406. } else {
  407. status = hdlc_decode(&in->hdlc_state, ptr, len, &count,
  408.      in->rcvbuf, in->bufsize);
  409. ptr += count;
  410. len -= count;
  411. }
  412. if (status > 0) {
  413. // Good frame received
  414. DBG(4,"count=%d",status);
  415. DBG_PACKET(0x400, in->rcvbuf, status);
  416. if (!(skb = dev_alloc_skb(status))) {
  417. WARN("receive out of memoryn");
  418. break;
  419. }
  420. memcpy(skb_put(skb, status), in->rcvbuf, status);
  421. in->hisax_if->l1l2(in->hisax_if, PH_DATA | INDICATION, skb);
  422. } else if (status == -HDLC_CRC_ERROR) {
  423. INFO("CRC error");
  424. } else if (status == -HDLC_FRAMING_ERROR) {
  425. INFO("framing error");
  426. } else if (status == -HDLC_LENGTH_ERROR) {
  427. INFO("length error");
  428. }
  429. }
  430. // Prepare URB for next transfer
  431. urb->dev = in->adapter->usb_dev;
  432. urb->actual_length = 0;
  433. SUBMIT_URB(urb);
  434. }
  435. int __devinit st5481_setup_in(struct st5481_in *in)
  436. {
  437. struct usb_device *dev = in->adapter->usb_dev;
  438. int retval;
  439. DBG(4,"");
  440. in->rcvbuf = kmalloc(in->bufsize, GFP_KERNEL);
  441. retval = -ENOMEM;
  442. if (!in->rcvbuf)
  443. goto err;
  444. retval = st5481_setup_isocpipes(in->urb, dev, 
  445. usb_rcvisocpipe(dev, in->ep),
  446. in->num_packets,  in->packet_size,
  447. in->num_packets * in->packet_size,
  448. usb_in_complete, in);
  449. if (retval)
  450. goto err_free;
  451. return 0;
  452.  err_free:
  453. kfree(in->rcvbuf);
  454.  err:
  455. return retval;
  456. }
  457. void st5481_release_in(struct st5481_in *in)
  458. {
  459. DBG(2,"");
  460. st5481_release_isocpipes(in->urb);
  461. }
  462. /*
  463.  * Make the transfer_buffer contiguous by
  464.  * copying from the iso descriptors if necessary. 
  465.  */
  466. int st5481_isoc_flatten(struct urb *urb)
  467. {
  468. struct iso_packet_descriptor *pipd;
  469. struct iso_packet_descriptor *pend;
  470. unsigned char *src,*dst;
  471. unsigned int len;
  472. if (urb->status < 0) {
  473. return urb->status;
  474. }
  475. for (pipd = &urb->iso_frame_desc[0],
  476.      pend = &urb->iso_frame_desc[urb->number_of_packets],
  477.      dst = urb->transfer_buffer; 
  478.      pipd < pend; 
  479.      pipd++) {
  480. if (pipd->status < 0) {
  481. return (pipd->status);
  482. }
  483. len = pipd->actual_length;
  484. pipd->actual_length = 0;
  485. src = urb->transfer_buffer+pipd->offset;
  486. if (src != dst) {
  487. // Need to copy since isoc buffers not full
  488. while (len--) {
  489. *dst++ = *src++;
  490. }
  491. } else {
  492. // No need to copy, just update destination buffer
  493. dst += len;
  494. }
  495. }
  496. // Return size of flattened buffer
  497. return (dst - (unsigned char *)urb->transfer_buffer);
  498. }
  499. static void st5481_start_rcv(void *context)
  500. {
  501. struct st5481_in *in = context;
  502. struct st5481_adapter *adapter = in->adapter;
  503. DBG(4,"");
  504. in->urb[0]->dev = adapter->usb_dev;
  505. SUBMIT_URB(in->urb[0]);
  506. in->urb[1]->dev = adapter->usb_dev;
  507. SUBMIT_URB(in->urb[1]);
  508. }
  509. void st5481_in_mode(struct st5481_in *in, int mode)
  510. {
  511. if (in->mode == mode)
  512. return;
  513. in->mode = mode;
  514. usb_unlink_urb(in->urb[0]);
  515. usb_unlink_urb(in->urb[1]);
  516. if (in->mode != L1_MODE_NULL) {
  517. if (in->mode != L1_MODE_TRANS)
  518. hdlc_rcv_init(&in->hdlc_state,
  519.       in->mode == L1_MODE_HDLC_56K);
  520. st5481_usb_pipe_reset(in->adapter, in->ep, NULL, NULL);
  521. st5481_usb_device_ctrl_msg(in->adapter, in->counter,
  522.    in->packet_size,
  523.    NULL, NULL);
  524. st5481_start_rcv(in);
  525. } else {
  526. st5481_usb_device_ctrl_msg(in->adapter, in->counter,
  527.    0, NULL, NULL);
  528. }
  529. }