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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  Copyright (c) 2001 Vojtech Pavlik
  3.  *
  4.  *  CATC EL1210A NetMate USB Ethernet driver
  5.  *
  6.  *  Sponsored by SuSE
  7.  *
  8.  *  Based on the work of
  9.  * Donald Becker
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or 
  15.  * (at your option) any later version.
  16.  * 
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  * 
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  25.  * 
  26.  * Should you need to contact me, the author, you can do so either by
  27.  * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
  28.  * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
  29.  */
  30. #include <linux/init.h>
  31. #include <linux/module.h>
  32. #include <linux/kernel.h>
  33. #include <linux/string.h>
  34. #include <linux/slab.h>
  35. #include <linux/netdevice.h>
  36. #include <linux/etherdevice.h>
  37. #include <linux/skbuff.h>
  38. #include <linux/spinlock.h>
  39. #include <asm/bitops.h>
  40. #undef DEBUG
  41. #include <linux/usb.h>
  42. /*
  43.  * Version information.
  44.  */
  45. #define DRIVER_VERSION "v2.7"
  46. #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@suse.cz>"
  47. #define DRIVER_DESC "CATC EL1210A NetMate USB Ethernet driver"
  48. MODULE_AUTHOR(DRIVER_AUTHOR);
  49. MODULE_DESCRIPTION(DRIVER_DESC);
  50. MODULE_LICENSE("GPL");
  51. /*
  52.  * Some defines.
  53.  */ 
  54. #define STATS_UPDATE (HZ) /* Time between stats updates */
  55. #define TX_TIMEOUT (5*HZ) /* Max time the queue can be stopped */
  56. #define PKT_SZ 1536 /* Max Ethernet packet size */
  57. #define RX_MAX_BURST 15 /* Max packets per rx buffer (> 0, < 16) */
  58. #define TX_MAX_BURST 15 /* Max full sized packets per tx buffer (> 0) */
  59. #define CTRL_QUEUE 16 /* Max control requests in flight (power of two) */
  60. /*
  61.  * Control requests.
  62.  */
  63. enum control_requests {
  64. ReadMem = 0xf1,
  65. GetMac = 0xf2,
  66. Reset = 0xf4,
  67. SetMac = 0xf5,
  68. WriteROM = 0xf8,
  69. SetReg = 0xfa,
  70. GetReg = 0xfb,
  71. WriteMem = 0xfc,
  72. ReadROM = 0xfd,
  73. };
  74. /*
  75.  * Registers.
  76.  */
  77. enum register_offsets {
  78. TxBufCount = 0x20,
  79. RxBufCount = 0x21,
  80. OpModes = 0x22,
  81. TxQed = 0x23,
  82. RxQed = 0x24,
  83. MaxBurst = 0x25,
  84. RxUnit = 0x60,
  85. EthStatus = 0x61,
  86. StationAddr0 = 0x67,
  87. EthStats = 0x69,
  88. LEDCtrl = 0x81,
  89. };
  90. enum eth_stats {
  91. TxSingleColl = 0x00,
  92.         TxMultiColl = 0x02,
  93.         TxExcessColl = 0x04,
  94.         RxFramErr = 0x06,
  95. };
  96. enum op_mode_bits {
  97. Op3MemWaits = 0x03,
  98. OpLenInclude = 0x08,
  99. OpRxMerge = 0x10,
  100. OpTxMerge = 0x20,
  101. OpWin95bugfix = 0x40,
  102. OpLoopback = 0x80,
  103. };
  104. enum rx_filter_bits {
  105. RxEnable = 0x01,
  106. RxPolarity = 0x02,
  107. RxForceOK = 0x04,
  108. RxMultiCast = 0x08,
  109. RxPromisc = 0x10,
  110. };
  111. enum led_values {
  112. LEDFast =  0x01,
  113. LEDSlow = 0x02,
  114. LEDFlash = 0x03,
  115. LEDPulse = 0x04,
  116. LEDLink = 0x08,
  117. };
  118. /*
  119.  * The catc struct.
  120.  */
  121. #define CTRL_RUNNING 0
  122. #define RX_RUNNING 1
  123. #define TX_RUNNING 2
  124. struct catc {
  125. struct net_device *netdev;
  126. struct usb_device *usbdev;
  127. struct net_device_stats stats;
  128. unsigned long flags;
  129. unsigned int tx_ptr, tx_idx;
  130. unsigned int ctrl_head, ctrl_tail;
  131. spinlock_t tx_lock, ctrl_lock;
  132. u8 tx_buf[2][TX_MAX_BURST * (PKT_SZ + 2)];
  133. u8 rx_buf[RX_MAX_BURST * (PKT_SZ + 2)];
  134. u8 irq_buf[2];
  135. u8 ctrl_buf[64];
  136. devrequest ctrl_dr;
  137. struct timer_list timer;
  138. u8 stats_buf[8];
  139. u16 stats_vals[4];
  140. unsigned long last_stats;
  141. u8 multicast[64];
  142. struct ctrl_queue {
  143. u8 dir;
  144. u8 request;
  145. u16 value;
  146. u16 index;
  147. void *buf;
  148. int len;
  149. void (*callback)(struct catc *catc, struct ctrl_queue *q);
  150. } ctrl_queue[CTRL_QUEUE];
  151. struct urb tx_urb, rx_urb, irq_urb, ctrl_urb;
  152. };
  153. /*
  154.  * Useful macros.
  155.  */
  156. #define catc_get_mac(catc, mac) catc_ctrl_msg(catc, USB_DIR_IN,  GetMac, 0, 0, mac,  6)
  157. #define catc_reset(catc) catc_ctrl_msg(catc, USB_DIR_OUT, Reset, 0, 0, NULL, 0)
  158. #define catc_set_reg(catc, reg, val) catc_ctrl_msg(catc, USB_DIR_OUT, SetReg, val, reg, NULL, 0)
  159. #define catc_get_reg(catc, reg, buf) catc_ctrl_msg(catc, USB_DIR_IN,  GetReg, 0, reg, buf, 1)
  160. #define catc_write_mem(catc, addr, buf, size) catc_ctrl_msg(catc, USB_DIR_OUT, WriteMem, 0, addr, buf, size)
  161. #define catc_read_mem(catc, addr, buf, size) catc_ctrl_msg(catc, USB_DIR_IN,  ReadMem, 0, addr, buf, size)
  162. #define catc_set_reg_async(catc, reg, val) catc_ctrl_async(catc, USB_DIR_OUT, SetReg, val, reg, NULL, 0, NULL)
  163. #define catc_get_reg_async(catc, reg, cb) catc_ctrl_async(catc, USB_DIR_IN, GetReg, 0, reg, NULL, 1, cb)
  164. #define catc_write_mem_async(catc, addr, buf, size) catc_ctrl_async(catc, USB_DIR_OUT, WriteMem, 0, addr, buf, size, NULL)
  165. /*
  166.  * Receive routines.
  167.  */
  168. static void catc_rx_done(struct urb *urb)
  169. {
  170. struct catc *catc = urb->context;
  171. u8 *pkt_start = urb->transfer_buffer;
  172. struct sk_buff *skb;
  173. int pkt_len;
  174. clear_bit(RX_RUNNING, &catc->flags);
  175. if (urb->status) {
  176. dbg("rx_done, status %d, length %d", urb->status, urb->actual_length);
  177. return;
  178. }
  179. do {
  180. pkt_len = le16_to_cpup((u16*)pkt_start);
  181. if (pkt_len > urb->actual_length) {
  182. catc->stats.rx_length_errors++;
  183. catc->stats.rx_errors++;
  184. break;
  185. }
  186. if (!(skb = dev_alloc_skb(pkt_len)))
  187. return;
  188. skb->dev = catc->netdev;
  189. eth_copy_and_sum(skb, pkt_start + 2, pkt_len, 0);
  190. skb_put(skb, pkt_len);
  191. skb->protocol = eth_type_trans(skb, catc->netdev);
  192. netif_rx(skb);
  193. catc->stats.rx_packets++;
  194. catc->stats.rx_bytes += pkt_len;
  195. pkt_start += (((pkt_len + 1) >> 6) + 1) << 6;
  196. } while (pkt_start - (u8 *) urb->transfer_buffer < urb->actual_length);
  197. catc->netdev->last_rx = jiffies;
  198. }
  199. static void catc_irq_done(struct urb *urb)
  200. {
  201. struct catc *catc = urb->context;
  202. u8 *data = urb->transfer_buffer;
  203. int status;
  204. if (urb->status) {
  205. dbg("irq_done, status %d, data %02x %02x.", urb->status, data[0], data[1]);
  206. return;
  207. }
  208. if ((data[1] & 0x80) && !test_and_set_bit(RX_RUNNING, &catc->flags)) {
  209. catc->rx_urb.dev = catc->usbdev;
  210. if ((status = usb_submit_urb(&catc->rx_urb)) < 0) {
  211. err("submit(rx_urb) status %d", status);
  212. return;
  213. }
  214. if (data[1] & 0x40)
  215. dbg("link ok");
  216. if (data[1] & 0x20) 
  217. dbg("link bad");
  218. }
  219. /*
  220.  * Transmit routines.
  221.  */
  222. static void catc_tx_run(struct catc *catc)
  223. {
  224. int status;
  225. catc->tx_urb.transfer_buffer_length = catc->tx_ptr;
  226. catc->tx_urb.transfer_buffer = catc->tx_buf[catc->tx_idx];
  227. catc->tx_urb.dev = catc->usbdev;
  228. if ((status = usb_submit_urb(&catc->tx_urb)) < 0)
  229. err("submit(tx_urb), status %d", status);
  230. catc->tx_idx = !catc->tx_idx;
  231. catc->tx_ptr = 0;
  232. catc->netdev->trans_start = jiffies;
  233. }
  234. static void catc_tx_done(struct urb *urb)
  235. {
  236. struct catc *catc = urb->context;
  237. unsigned long flags;
  238. if (urb->status == -ECONNRESET) {
  239. dbg("Tx Reset.");
  240. urb->transfer_flags &= ~USB_ASYNC_UNLINK;
  241. urb->status = 0;
  242. catc->netdev->trans_start = jiffies;
  243. catc->stats.tx_errors++;
  244. clear_bit(TX_RUNNING, &catc->flags);
  245. netif_wake_queue(catc->netdev);
  246. return;
  247. }
  248. if (urb->status) {
  249. dbg("tx_done, status %d, length %d", urb->status, urb->actual_length);
  250. return;
  251. }
  252. spin_lock_irqsave(&catc->tx_lock, flags);
  253. if (catc->tx_ptr)
  254. catc_tx_run(catc);
  255. else
  256. clear_bit(TX_RUNNING, &catc->flags);
  257. netif_wake_queue(catc->netdev);
  258. spin_unlock_irqrestore(&catc->tx_lock, flags);
  259. }
  260. static int catc_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
  261. {
  262. struct catc *catc = netdev->priv;
  263. unsigned long flags;
  264. char *tx_buf;
  265. spin_lock_irqsave(&catc->tx_lock, flags);
  266. catc->tx_ptr = (((catc->tx_ptr - 1) >> 6) + 1) << 6;
  267. tx_buf = catc->tx_buf[catc->tx_idx] + catc->tx_ptr;
  268. *((u16*)tx_buf) = cpu_to_le16((u16)skb->len);
  269. memcpy(tx_buf + 2, skb->data, skb->len);
  270. catc->tx_ptr += skb->len + 2;
  271. if (!test_and_set_bit(TX_RUNNING, &catc->flags))
  272. catc_tx_run(catc);
  273. if (catc->tx_ptr >= ((TX_MAX_BURST - 1) * (PKT_SZ + 2)))
  274. netif_stop_queue(netdev);
  275. spin_unlock_irqrestore(&catc->tx_lock, flags);
  276. catc->stats.tx_bytes += skb->len;
  277. catc->stats.tx_packets++;
  278. dev_kfree_skb(skb);
  279. return 0;
  280. }
  281. static void catc_tx_timeout(struct net_device *netdev)
  282. {
  283. struct catc *catc = netdev->priv;
  284. warn("Transmit timed out.");
  285. catc->tx_urb.transfer_flags |= USB_ASYNC_UNLINK;
  286. usb_unlink_urb(&catc->tx_urb);
  287. }
  288. /*
  289.  * Control messages.
  290.  */
  291. static int catc_ctrl_msg(struct catc *catc, u8 dir, u8 request, u16 value, u16 index, void *buf, int len)
  292. {
  293.         int retval = usb_control_msg(catc->usbdev,
  294. dir ? usb_rcvctrlpipe(catc->usbdev, 0) : usb_sndctrlpipe(catc->usbdev, 0),
  295.  request, 0x40 | dir, value, index, buf, len, HZ);
  296.         return retval < 0 ? retval : 0;
  297. }
  298. static void catc_ctrl_run(struct catc *catc)
  299. {
  300. struct ctrl_queue *q = catc->ctrl_queue + catc->ctrl_tail;
  301. struct usb_device *usbdev = catc->usbdev;
  302. struct urb *urb = &catc->ctrl_urb;
  303. devrequest *dr = &catc->ctrl_dr;
  304. int status;
  305. dr->request = q->request;
  306. dr->requesttype = 0x40 | q->dir;
  307. dr->value = cpu_to_le16(q->value);
  308. dr->index = cpu_to_le16(q->index);
  309. dr->length = cpu_to_le16(q->len);
  310.         urb->pipe = q->dir ? usb_rcvctrlpipe(usbdev, 0) : usb_sndctrlpipe(usbdev, 0);
  311. urb->transfer_buffer_length = q->len;
  312. urb->transfer_buffer = catc->ctrl_buf;
  313. urb->setup_packet = (void *) dr;
  314. urb->dev = usbdev;
  315. if (!q->dir && q->buf && q->len)
  316. memcpy(catc->ctrl_buf, q->buf, q->len);
  317. if ((status = usb_submit_urb(&catc->ctrl_urb)))
  318. err("submit(ctrl_urb) status %d", status);
  319. }
  320. static void catc_ctrl_done(struct urb *urb)
  321. {
  322. struct catc *catc = urb->context;
  323. struct ctrl_queue *q;
  324. long flags;
  325. if (urb->status)
  326. dbg("ctrl_done, status %d, len %d.", urb->status, urb->actual_length);
  327. spin_lock_irqsave(&catc->ctrl_lock, flags);
  328. q = catc->ctrl_queue + catc->ctrl_tail;
  329. if (q->dir) {
  330. if (q->buf && q->len)
  331. memcpy(q->buf, catc->ctrl_buf, q->len);
  332. else
  333. q->buf = catc->ctrl_buf;
  334. }
  335. if (q->callback)
  336. q->callback(catc, q);
  337. catc->ctrl_tail = (catc->ctrl_tail + 1) & (CTRL_QUEUE - 1);
  338. if (catc->ctrl_head != catc->ctrl_tail)
  339. catc_ctrl_run(catc);
  340. else
  341. clear_bit(CTRL_RUNNING, &catc->flags);
  342. spin_unlock_irqrestore(&catc->ctrl_lock, flags);
  343. }
  344. static int catc_ctrl_async(struct catc *catc, u8 dir, u8 request, u16 value,
  345. u16 index, void *buf, int len, void (*callback)(struct catc *catc, struct ctrl_queue *q))
  346. {
  347. struct ctrl_queue *q;
  348. int retval = 0;
  349. long flags;
  350. spin_lock_irqsave(&catc->ctrl_lock, flags);
  351. q = catc->ctrl_queue + catc->ctrl_head;
  352. q->dir = dir;
  353. q->request = request;
  354. q->value = value;
  355. q->index = index;
  356. q->buf = buf;
  357. q->len = len;
  358. q->callback = callback;
  359. catc->ctrl_head = (catc->ctrl_head + 1) & (CTRL_QUEUE - 1);
  360. if (catc->ctrl_head == catc->ctrl_tail) {
  361. err("ctrl queue full");
  362. catc->ctrl_tail = (catc->ctrl_tail + 1) & (CTRL_QUEUE - 1);
  363. retval = -1;
  364. }
  365. if (!test_and_set_bit(CTRL_RUNNING, &catc->flags))
  366. catc_ctrl_run(catc);
  367. spin_unlock_irqrestore(&catc->ctrl_lock, flags);
  368. return retval;
  369. }
  370. /*
  371.  * Statistics.
  372.  */
  373. static void catc_stats_done(struct catc *catc, struct ctrl_queue *q)
  374. {
  375. int index = q->index - EthStats;
  376. u16 data, last;
  377. catc->stats_buf[index] = *((char *)q->buf);
  378. if (index & 1)
  379. return;
  380. data = ((u16)catc->stats_buf[index] << 8) | catc->stats_buf[index + 1];
  381. last = catc->stats_vals[index >> 1];
  382. switch (index) {
  383. case TxSingleColl:
  384. case TxMultiColl:
  385. catc->stats.collisions += data - last;
  386. break;
  387. case TxExcessColl:
  388. catc->stats.tx_aborted_errors += data - last;
  389. catc->stats.tx_errors += data - last;
  390. break;
  391. case RxFramErr:
  392. catc->stats.rx_frame_errors += data - last;
  393. catc->stats.rx_errors += data - last;
  394. break;
  395. }
  396. catc->stats_vals[index >> 1] = data;
  397. }
  398. static void catc_stats_timer(unsigned long data)
  399. {
  400. struct catc *catc = (void *) data;
  401. int i;
  402. for (i = 0; i < 8; i++)
  403. catc_get_reg_async(catc, EthStats + 7 - i, catc_stats_done);
  404. mod_timer(&catc->timer, jiffies + STATS_UPDATE);
  405. }
  406. static struct net_device_stats *catc_get_stats(struct net_device *netdev)
  407. {
  408. struct catc *catc = netdev->priv;
  409. return &catc->stats;
  410. }
  411. /*
  412.  * Receive modes. Broadcast, Multicast, Promisc.
  413.  */
  414. static void catc_multicast(unsigned char *addr, u8 *multicast)
  415. {
  416. unsigned int crc = 0xffffffff;
  417. u8 byte, idx, bit;
  418.         for (idx = 0; idx < 6; idx++)
  419.                 for (byte = *addr++, bit = 0; bit < 8; bit++, byte >>= 1)
  420.                         crc = (crc >> 1) ^ (((crc ^ byte) & 1) ? 0xedb88320U : 0);
  421. multicast[(crc >> 3) & 0x3f] |= 1 << (crc & 7);
  422. }
  423. static void catc_set_multicast_list(struct net_device *netdev)
  424. {
  425. struct catc *catc = netdev->priv;
  426. struct dev_mc_list *mc;
  427. u8 broadcast[6];
  428. u8 rx = RxEnable | RxPolarity | RxMultiCast;
  429. int i;
  430. memset(broadcast, 0xff, 6);
  431. memset(catc->multicast, 0, 64);
  432. catc_multicast(broadcast, catc->multicast);
  433. catc_multicast(netdev->dev_addr, catc->multicast);
  434. if (netdev->flags & IFF_PROMISC) {
  435. memset(catc->multicast, 0xff, 64);
  436. rx |= RxPromisc;
  437. if (netdev->flags & IFF_ALLMULTI)
  438. memset(catc->multicast, 0xff, 64);
  439. for (i = 0, mc = netdev->mc_list; mc && i < netdev->mc_count; i++, mc = mc->next)
  440. catc_multicast(mc->dmi_addr, catc->multicast);
  441. catc_set_reg_async(catc, RxUnit, rx);
  442. catc_write_mem_async(catc, 0xfa80, catc->multicast, 64);
  443. }
  444. /*
  445.  * Open, close.
  446.  */
  447. static int catc_open(struct net_device *netdev)
  448. {
  449. struct catc *catc = netdev->priv;
  450. int status;
  451. catc->irq_urb.dev = catc->usbdev;
  452. if ((status = usb_submit_urb(&catc->irq_urb)) < 0) {
  453. err("submit(irq_urb) status %d", status);
  454. return -1;
  455. }
  456. netif_start_queue(netdev);
  457. mod_timer(&catc->timer, jiffies + STATS_UPDATE);
  458. return 0;
  459. }
  460. static int catc_stop(struct net_device *netdev)
  461. {
  462. struct catc *catc = netdev->priv;
  463. netif_stop_queue(netdev);
  464. del_timer_sync(&catc->timer);
  465. usb_unlink_urb(&catc->rx_urb);
  466. usb_unlink_urb(&catc->tx_urb);
  467. usb_unlink_urb(&catc->irq_urb);
  468. usb_unlink_urb(&catc->ctrl_urb);
  469. return 0;
  470. }
  471. /*
  472.  * USB probe, disconnect.
  473.  */
  474. static void *catc_probe(struct usb_device *usbdev, unsigned int ifnum, const struct usb_device_id *id)
  475. {
  476. struct net_device *netdev;
  477. struct catc *catc;
  478. u8 broadcast[6];
  479. int i;
  480. if (usb_set_interface(usbdev, ifnum, 1)) {
  481.                 err("Can't set altsetting 1.");
  482. return NULL;
  483. }
  484. catc = kmalloc(sizeof(struct catc), GFP_KERNEL);
  485. memset(catc, 0, sizeof(struct catc));
  486. netdev = init_etherdev(0, 0);
  487. netdev->open = catc_open;
  488. netdev->hard_start_xmit = catc_hard_start_xmit;
  489. netdev->stop = catc_stop;
  490. netdev->get_stats = catc_get_stats;
  491. netdev->tx_timeout = catc_tx_timeout;
  492. netdev->watchdog_timeo = TX_TIMEOUT;
  493. netdev->set_multicast_list = catc_set_multicast_list;
  494. netdev->priv = catc;
  495. catc->usbdev = usbdev;
  496. catc->netdev = netdev;
  497. catc->tx_lock = SPIN_LOCK_UNLOCKED;
  498. catc->ctrl_lock = SPIN_LOCK_UNLOCKED;
  499. init_timer(&catc->timer);
  500. catc->timer.data = (long) catc;
  501. catc->timer.function = catc_stats_timer;
  502. FILL_CONTROL_URB(&catc->ctrl_urb, usbdev, usb_sndctrlpipe(usbdev, 0),
  503. NULL, NULL, 0, catc_ctrl_done, catc);
  504. FILL_BULK_URB(&catc->tx_urb, usbdev, usb_sndbulkpipe(usbdev, 1),
  505. NULL, 0, catc_tx_done, catc);
  506. FILL_BULK_URB(&catc->rx_urb, usbdev, usb_rcvbulkpipe(usbdev, 1),
  507. catc->rx_buf, RX_MAX_BURST * (PKT_SZ + 2), catc_rx_done, catc);
  508. FILL_INT_URB(&catc->irq_urb, usbdev, usb_rcvintpipe(usbdev, 2),
  509.                 catc->irq_buf, 2, catc_irq_done, catc, 1);
  510. dbg("Checking memory sizen");
  511. i = 0x12345678;
  512. catc_write_mem(catc, 0x7a80, &i, 4);
  513. i = 0x87654321;
  514. catc_write_mem(catc, 0xfa80, &i, 4);
  515. catc_read_mem(catc, 0x7a80, &i, 4);
  516. switch (i) {
  517. case 0x12345678:
  518. catc_set_reg(catc, TxBufCount, 8);
  519. catc_set_reg(catc, RxBufCount, 32);
  520. dbg("64k Memoryn");
  521. break;
  522. default:
  523. warn("Couldn't detect memory size, assuming 32k");
  524. case 0x87654321:
  525. catc_set_reg(catc, TxBufCount, 4);
  526. catc_set_reg(catc, RxBufCount, 16);
  527. dbg("32k Memoryn");
  528. break;
  529. }
  530. dbg("Getting MAC from SEEROM.");
  531. catc_get_mac(catc, netdev->dev_addr);
  532. dbg("Setting MAC into registers.");
  533. for (i = 0; i < 6; i++)
  534. catc_set_reg(catc, StationAddr0 - i, netdev->dev_addr[i]);
  535. dbg("Filling the multicast list.");
  536. memset(broadcast, 0xff, 8);
  537. catc_multicast(broadcast, catc->multicast);
  538. catc_multicast(netdev->dev_addr, catc->multicast);
  539. catc_write_mem(catc, 0xfa80, catc->multicast, 64);
  540. dbg("Clearing error counters.");
  541. for (i = 0; i < 8; i++)
  542. catc_set_reg(catc, EthStats + i, 0);
  543. catc->last_stats = jiffies;
  544. dbg("Enabling.");
  545. catc_set_reg(catc, MaxBurst, RX_MAX_BURST);
  546. catc_set_reg(catc, OpModes, OpTxMerge | OpRxMerge | OpLenInclude | Op3MemWaits);
  547. catc_set_reg(catc, LEDCtrl, LEDLink);
  548. catc_set_reg(catc, RxUnit, RxEnable | RxPolarity | RxMultiCast);
  549. dbg("Init done.");
  550. printk(KERN_INFO "%s: CATC EL1210A NetMate USB Ethernet at usb%d:%d.%d, ",
  551. netdev->name, usbdev->bus->busnum, usbdev->devnum, ifnum);
  552. for (i = 0; i < 5; i++) printk("%2.2x:", netdev->dev_addr[i]);
  553. printk("%2.2x.n", netdev->dev_addr[i]);
  554. return catc;
  555. }
  556. static void catc_disconnect(struct usb_device *usbdev, void *dev_ptr)
  557. {
  558. struct catc *catc = dev_ptr;
  559. unregister_netdev(catc->netdev);
  560. kfree(catc->netdev);
  561. kfree(catc);
  562. }
  563. /*
  564.  * Module functions and tables.
  565.  */
  566. static struct usb_device_id catc_id_table [] = {
  567. { USB_DEVICE(0x0423, 0xa) }, /* CATC Netmate */
  568. { USB_DEVICE(0x0423, 0xc) }, /* CATC Netmate II, Belkin F5U111 */
  569. { USB_DEVICE(0x08d1, 0x1) }, /* smartBridges smartNIC */
  570. { }
  571. };
  572. MODULE_DEVICE_TABLE(usb, catc_id_table);
  573. static struct usb_driver catc_driver = {
  574. name: "catc",
  575. probe: catc_probe,
  576. disconnect: catc_disconnect,
  577. id_table: catc_id_table,
  578. };
  579. static int __init catc_init(void)
  580. {
  581. info(DRIVER_VERSION " " DRIVER_DESC);
  582. usb_register(&catc_driver);
  583. return 0;
  584. }
  585. static void __exit catc_exit(void)
  586. {
  587. usb_deregister(&catc_driver);
  588. }
  589. module_init(catc_init);
  590. module_exit(catc_exit);