Merge tag 'lsk-v3.10-15.04-android'
[firefly-linux-kernel-4.4.55.git] / drivers / net / usb / sr9700.c
1 /*
2  * SR9700_android one chip USB 2.0 ethernet devices
3  *
4  * Author : jokeliujl <jokeliu@163.com>
5  * Date : 2010-10-01
6  *
7  * This file is licensed under the terms of the GNU General Public License
8  * version 2.  This program is licensed "as is" without any warranty of any
9  * kind, whether express or implied.
10  */
11
12 #define DEBUG
13
14 #include <linux/module.h>
15 #include <linux/sched.h>
16 #include <linux/stddef.h>
17 #include <linux/init.h>
18 #include <linux/netdevice.h>
19 #include <linux/etherdevice.h>
20 #include <linux/ethtool.h>
21 #include <linux/mii.h>
22 #include <linux/usb.h>
23 #include <linux/crc32.h>
24 #include <linux/usb/usbnet.h>
25
26 #include "sr9700.h"
27
28 /* ------------------------------------------------------------------------------------------ */
29 /* sr9700_android mac and phy operations */
30 /* sr9700_android read some registers from MAC */
31 static int qf_read(struct usbnet *dev, u8 reg, u16 length, void *data)
32 {
33         void *buf;
34         int err = -ENOMEM;
35
36         devdbg(dev, "qf_read() reg=0x%02x length=%d", reg, length);
37
38         buf = kmalloc(length, GFP_KERNEL);
39         if (!buf)
40                 goto out;
41
42         err = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), 
43                                 QF_RD_REGS, QF_REQ_RD_REG,
44                             0, reg, buf, length, USB_CTRL_SET_TIMEOUT);
45         if (err == length)
46                 memcpy(data, buf, length);
47         else if (err >= 0)
48                 err = -EINVAL;
49         kfree(buf);
50
51  out:
52         return err;
53 }
54
55 /* sr9700_android write some registers to MAC */
56 static int qf_write(struct usbnet *dev, u8 reg, u16 length, void *data)
57 {
58         void *buf = NULL;
59         int err = -ENOMEM;
60
61         devdbg(dev, "qf_write() reg=0x%02x, length=%d", reg, length);
62
63         if (data) {
64                 buf = kmalloc(length, GFP_KERNEL);
65                 if (!buf)
66                         goto out;
67                 memcpy(buf, data, length);
68         }
69
70         err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
71                               QF_WR_REGS, QF_REQ_WR_REG,
72                               0, reg, buf, length, USB_CTRL_SET_TIMEOUT);
73         kfree(buf);
74         if (err >= 0 && err < length)
75                 err = -EINVAL;
76  out:
77         return err;
78 }
79
80 /* sr9700_android read one register from MAC */
81 static int qf_read_reg(struct usbnet *dev, u8 reg, u8 *value)
82 {
83         return qf_read(dev, reg, 1, value);
84 }
85
86 /* sr9700_android write one register to MAC */
87 static int qf_write_reg(struct usbnet *dev, u8 reg, u8 value)
88 {
89         devdbg(dev, "qf_write_reg() reg=0x%02x, value=0x%02x", reg, value);
90         return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
91                                QF_WR_REG, QF_REQ_WR_REG,
92                                value, reg, NULL, 0, USB_CTRL_SET_TIMEOUT);
93 }
94
95 /* async mode for writing registers or reg blocks */
96 static void qf_write_async_callback(struct urb *urb)
97 {
98         struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context;
99
100         if (urb->status < 0)
101                 printk(KERN_DEBUG "qf_write_async_callback() failed with %d\n", urb->status);
102
103         kfree(req);
104         usb_free_urb(urb);
105 }
106
107 static void qf_write_async_helper(struct usbnet *dev, u8 reg, u8 value, u16 length, void *data)
108 {
109         struct usb_ctrlrequest *req;
110         struct urb *urb;
111         int status;
112
113         urb = usb_alloc_urb(0, GFP_ATOMIC);
114         if (!urb) {
115                 deverr(dev, "Error allocating URB in qf_write_async_helper!");
116                 return;
117         }
118
119         req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
120         if (!req) {
121                 deverr(dev, "Failed to allocate memory for control request");
122                 usb_free_urb(urb);
123                 return;
124         }
125
126         req->bRequestType = QF_REQ_WR_REG;
127         req->bRequest = length ? QF_WR_REGS : QF_WR_REG;
128         req->wValue = cpu_to_le16(value);
129         req->wIndex = cpu_to_le16(reg);
130         req->wLength = cpu_to_le16(length);
131
132         usb_fill_control_urb(urb, dev->udev, usb_sndctrlpipe(dev->udev, 0),
133                              (void *)req, data, length,
134                              qf_write_async_callback, req);
135
136         status = usb_submit_urb(urb, GFP_ATOMIC);
137         if (status < 0) {
138                 deverr(dev, "Error submitting the control message: status=%d",
139                        status);
140                 kfree(req);
141                 usb_free_urb(urb);
142         }
143
144         return;
145 }
146
147 static void qf_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)
148 {
149         devdbg(dev, "qf_write_async() reg=0x%02x length=%d", reg, length);
150
151         qf_write_async_helper(dev, reg, 0, length, data);
152 }
153
154 static void qf_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
155 {
156         devdbg(dev, "qf_write_reg_async() reg=0x%02x value=0x%02x", reg, value);
157
158         qf_write_async_helper(dev, reg, value, 0, NULL);
159 }
160
161 /* sr9700_android read one word from phy or eeprom  */
162 static int qf_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value)
163 {
164         int ret, i;
165
166         mutex_lock(&dev->phy_mutex);
167
168         qf_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
169         qf_write_reg(dev, EPCR, phy ? 0xc : 0x4);
170
171         for (i = 0; i < QF_SHARE_TIMEOUT; i++) {
172                 u8 tmp;
173
174                 udelay(1);
175                 ret = qf_read_reg(dev, EPCR, &tmp);
176                 if (ret < 0)
177                         goto out;
178
179                 /* ready */
180                 if ((tmp & 1) == 0)
181                         break;
182         }
183
184         if (i >= QF_SHARE_TIMEOUT) {
185                 deverr(dev, "%s read timed out!", phy ? "phy" : "eeprom");
186                 ret = -EIO;
187                 goto out;
188         }
189
190         qf_write_reg(dev, EPCR, 0x0);
191         ret = qf_read(dev, EPDR, 2, value);
192
193         devdbg(dev, "read shared %d 0x%02x returned 0x%04x, %d",
194                phy, reg, *value, ret);
195
196  out:
197         mutex_unlock(&dev->phy_mutex);
198         return ret;
199 }
200
201 /* write one word to phy or eeprom */
202 static int qf_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 value)
203 {
204         int ret, i;
205
206         mutex_lock(&dev->phy_mutex);
207
208         ret = qf_write(dev, EPDR, 2, &value);
209         if (ret < 0)
210                 goto out;
211
212         qf_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
213         qf_write_reg(dev, EPCR, phy ? 0x1a : 0x12);
214
215         for (i = 0; i < QF_SHARE_TIMEOUT; i++) {
216                 u8 tmp;
217
218                 udelay(1);
219                 ret = qf_read_reg(dev, EPCR, &tmp);
220                 if (ret < 0)
221                         goto out;
222
223                 /* ready */
224                 if ((tmp & 1) == 0)
225                         break;
226         }
227
228         if (i >= QF_SHARE_TIMEOUT) {
229                 deverr(dev, "%s write timed out!", phy ? "phy" : "eeprom");
230                 ret = -EIO;
231                 goto out;
232         }
233
234         qf_write_reg(dev, EPCR, 0x0);
235
236 out:
237         mutex_unlock(&dev->phy_mutex);
238         return ret;
239 }
240
241 static int qf_read_eeprom_word(struct usbnet *dev, u8 offset, void *value)
242 {
243         return qf_share_read_word(dev, 0, offset, value);
244 }
245
246
247 static int sr9700_android_get_eeprom_len(struct net_device *dev)
248 {
249         return QF_EEPROM_LEN;
250 }
251
252 /* get sr9700_android eeprom information */
253 static int sr9700_android_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 * data)
254 {
255         struct usbnet *dev = netdev_priv(net);
256         __le16 *ebuf = (__le16 *) data;
257         int i;
258
259         /* access is 16bit */
260         if ((eeprom->offset % 2) || (eeprom->len % 2))
261                 return -EINVAL;
262
263         for (i = 0; i < eeprom->len / 2; i++) {
264                 if (qf_read_eeprom_word(dev, eeprom->offset / 2 + i, &ebuf[i]) < 0)
265                         return -EINVAL;
266         }
267         return 0;
268 }
269
270 /* sr9700_android mii-phy register read by word */
271 static int sr9700_android_mdio_read(struct net_device *netdev, int phy_id, int loc)
272 {
273         struct usbnet *dev = netdev_priv(netdev);
274
275         __le16 res;
276
277         if (phy_id) {
278                 devdbg(dev, "Only internal phy supported");
279                 return 0;
280         }
281
282         qf_share_read_word(dev, 1, loc, &res);
283
284         devdbg(dev,
285                "sr9700_android_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x",
286                phy_id, loc, le16_to_cpu(res));
287
288         return le16_to_cpu(res);
289 }
290
291 /* sr9700_android mii-phy register write by word */
292 static void sr9700_android_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
293 {
294         struct usbnet *dev = netdev_priv(netdev);
295         __le16 res = cpu_to_le16(val);
296
297         if (phy_id) {
298                 devdbg(dev, "Only internal phy supported");
299                 return;
300         }
301
302         devdbg(dev,"sr9700_android_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x",
303                phy_id, loc, val);
304
305         qf_share_write_word(dev, 1, loc, res);
306 }
307
308 /*-------------------------------------------------------------------------------------------*/
309
310 static void sr9700_android_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
311 {
312         /* Inherit standard device info */
313         usbnet_get_drvinfo(net, info);
314         info->eedump_len = QF_EEPROM_LEN;
315 }
316
317 static u32 sr9700_android_get_link(struct net_device *net)
318 {
319         struct usbnet *dev = netdev_priv(net);
320         int rc = 0;
321         u8 value = 0;
322
323 #if     0
324         rc = mii_link_ok(&dev->mii);
325 #else
326         qf_read_reg(dev, NSR, &value);
327         if(value & NSR_LINKST) {
328                 rc = 1;
329         }
330 #endif
331
332         return rc;
333 }
334
335 static int sr9700_android_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
336 {
337         struct usbnet *dev = netdev_priv(net);
338
339         return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
340 }
341
342 static const struct ethtool_ops sr9700_android_ethtool_ops = {
343         .get_drvinfo    = sr9700_android_get_drvinfo,
344         .get_link       = sr9700_android_get_link,
345         .get_msglevel   = usbnet_get_msglevel,
346         .set_msglevel   = usbnet_set_msglevel,
347         .get_eeprom_len = sr9700_android_get_eeprom_len,
348         .get_eeprom     = sr9700_android_get_eeprom,
349         .get_settings   = usbnet_get_settings,
350         .set_settings   = usbnet_set_settings,
351         .nway_reset     = usbnet_nway_reset,
352 };
353
354 static void sr9700_android_set_multicast(struct net_device *net)
355 {
356         struct usbnet *dev = netdev_priv(net);
357         /* We use the 20 byte dev->data for our 8 byte filter buffer
358          * to avoid allocating memory that is tricky to free later */
359         u8 *hashes = (u8 *) & dev->data;
360         u8 rx_ctl = 0x31;
361
362         memset(hashes, 0x00, QF_MCAST_SIZE);
363         hashes[QF_MCAST_SIZE - 1] |= 0x80;      /* broadcast address */
364
365         if (net->flags & IFF_PROMISC) {
366                 rx_ctl |= 0x02;
367         } else if (net->flags & IFF_ALLMULTI ||
368                    netdev_mc_count(net) > QF_MCAST_MAX) {
369                 rx_ctl |= 0x04;
370         } else if (!netdev_mc_empty(net)) {
371                 struct netdev_hw_addr *ha;
372
373                 netdev_for_each_mc_addr(ha, net) {
374                         u32 crc = ether_crc(ETH_ALEN, ha->addr) >> 26;
375                         hashes[crc >> 3] |= 1 << (crc & 0x7);
376                 }
377         }
378
379         qf_write_async(dev, MAR, QF_MCAST_SIZE, hashes);
380         qf_write_reg_async(dev, RCR, rx_ctl);
381 }
382
383 static int sr9700_android_set_mac_address(struct net_device *net, void *p)
384 {
385         struct sockaddr *addr = p;
386         struct usbnet *dev = netdev_priv(net);
387
388         if (!is_valid_ether_addr(addr->sa_data)) {
389                 dev_err(&net->dev, "not setting invalid mac address %pM\n",
390                                                                 addr->sa_data);
391                 return -EINVAL;
392         }
393
394         memcpy(net->dev_addr, addr->sa_data, net->addr_len);
395         qf_write_async(dev, PAR, 6, dev->net->dev_addr);
396
397         return 0;
398 }
399
400 static const struct net_device_ops sr9700_android_netdev_ops = {
401         .ndo_open               = usbnet_open,
402         .ndo_stop               = usbnet_stop,
403         .ndo_start_xmit         = usbnet_start_xmit,
404         .ndo_tx_timeout         = usbnet_tx_timeout,
405         .ndo_change_mtu         = usbnet_change_mtu,
406         .ndo_validate_addr      = eth_validate_addr,
407         .ndo_do_ioctl           = sr9700_android_ioctl,
408         .ndo_set_multicast_list = sr9700_android_set_multicast,
409         .ndo_set_mac_address    = sr9700_android_set_mac_address,
410 };
411
412 static int sr9700_android_bind(struct usbnet *dev, struct usb_interface *intf)
413 {
414         int ret;
415
416         ret = usbnet_get_endpoints(dev, intf);
417         if (ret)
418                 goto out;
419
420         dev->net->netdev_ops = &sr9700_android_netdev_ops;
421         dev->net->ethtool_ops = &sr9700_android_ethtool_ops;
422         dev->net->hard_header_len += QF_TX_OVERHEAD;
423         dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
424         dev->rx_urb_size = dev->net->mtu + ETH_HLEN + QF_RX_OVERHEAD;
425
426         dev->mii.dev = dev->net;
427         dev->mii.mdio_read = sr9700_android_mdio_read;
428         dev->mii.mdio_write = sr9700_android_mdio_write;
429         dev->mii.phy_id_mask = 0x1f;
430         dev->mii.reg_num_mask = 0x1f;
431
432         /* reset the sr9700_android */
433         qf_write_reg(dev, NCR, 1);
434         udelay(20);
435
436         /* read MAC */
437         if (qf_read(dev, PAR, ETH_ALEN, dev->net->dev_addr) < 0) {
438                 printk(KERN_ERR "Error reading MAC address\n");
439                 ret = -ENODEV;
440                 goto out;
441         }
442
443         /* power up and reset phy */
444         qf_write_reg(dev, PRR, 1);
445         mdelay(20);             // at least 10ms, here 20ms for safe
446         qf_write_reg(dev, PRR, 0);
447         udelay(2 * 1000);       // at least 1ms, here 2ms for reading right register
448
449         /* receive broadcast packets */
450         sr9700_android_set_multicast(dev->net);
451
452         sr9700_android_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
453         sr9700_android_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
454         mii_nway_restart(&dev->mii);
455
456 out:
457         return ret;
458 }
459
460 static int sr9700_android_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
461 {
462         u8 status;
463         int len;
464
465         /* format:
466            b0: rx status
467            b1: packet length (incl crc) low
468            b2: packet length (incl crc) high
469            b3..n-4: packet data
470            bn-3..bn: ethernet crc
471          */
472
473         if (unlikely(skb->len < QF_RX_OVERHEAD)) {
474                 dev_err(&dev->udev->dev, "unexpected tiny rx frame\n");
475                 return 0;
476         }
477
478         status = skb->data[0];
479         len = (skb->data[1] | (skb->data[2] << 8)) - 4;
480
481         if (unlikely(status & 0xbf)) {
482                 if (status & 0x01) dev->net->stats.rx_fifo_errors++;
483                 if (status & 0x02) dev->net->stats.rx_crc_errors++;
484                 if (status & 0x04) dev->net->stats.rx_frame_errors++;
485                 if (status & 0x20) dev->net->stats.rx_missed_errors++;
486                 if (status & 0x90) dev->net->stats.rx_length_errors++;
487                 return 0;
488         }
489
490         skb_pull(skb, 3);
491         skb_trim(skb, len);
492
493         return 1;
494 }
495
496 static struct sk_buff *sr9700_android_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
497 {
498         int len;
499
500         /* format:
501            b0: packet length low
502            b1: packet length high
503            b3..n: packet data
504         */
505
506         len = skb->len;
507
508         if (skb_headroom(skb) < QF_TX_OVERHEAD) {
509                 struct sk_buff *skb2;
510
511                 skb2 = skb_copy_expand(skb, QF_TX_OVERHEAD, 0, flags);
512                 dev_kfree_skb_any(skb);
513                 skb = skb2;
514                 if (!skb)
515                         return NULL;
516         }
517
518         __skb_push(skb, QF_TX_OVERHEAD);
519
520         /* usbnet adds padding if length is a multiple of packet size
521            if so, adjust length value in header */
522         if ((skb->len % dev->maxpacket) == 0)
523                 len++;
524
525         skb->data[0] = len;
526         skb->data[1] = len >> 8;
527
528         return skb;
529 }
530
531 static void sr9700_android_status(struct usbnet *dev, struct urb *urb)
532 {
533         int link;
534         u8 *buf;
535
536         /* format:
537            b0: net status
538            b1: tx status 1
539            b2: tx status 2
540            b3: rx status
541            b4: rx overflow
542            b5: rx count
543            b6: tx count
544            b7: gpr
545         */
546
547         if (urb->actual_length < 8)
548                 return;
549
550         buf = urb->transfer_buffer;
551
552         link = !!(buf[0] & 0x40);
553         if (netif_carrier_ok(dev->net) != link) {
554                 if (link) {
555                         netif_carrier_on(dev->net);
556                         usbnet_defer_kevent (dev, EVENT_LINK_RESET);
557                 }
558                 else
559                         netif_carrier_off(dev->net);
560                 devdbg(dev, "Link Status is: %d", link);
561         }
562 }
563
564 static int sr9700_android_link_reset(struct usbnet *dev)
565 {
566         struct ethtool_cmd ecmd;
567
568         mii_check_media(&dev->mii, 1, 1);
569         mii_ethtool_gset(&dev->mii, &ecmd);
570
571         devdbg(dev, "link_reset() speed: %d duplex: %d",
572                ecmd.speed, ecmd.duplex);
573
574         return 0;
575 }
576
577 static const struct driver_info sr9700_android_info = {
578         .description    = "SR9700_ANDROID USB Ethernet",
579         .flags          = FLAG_ETHER,
580         .bind           = sr9700_android_bind,
581         .rx_fixup       = sr9700_android_rx_fixup,
582         .tx_fixup       = sr9700_android_tx_fixup,
583         .status         = sr9700_android_status,
584         .link_reset     = sr9700_android_link_reset,
585         .reset          = sr9700_android_link_reset,
586 };
587
588 static const struct usb_device_id products[] = {
589         {
590          USB_DEVICE(0x0fe6, 0x9700),    /* SR9700_ANDROID device */
591          .driver_info = (unsigned long)&sr9700_android_info,
592          },
593         {},                     // END
594 };
595
596 MODULE_DEVICE_TABLE(usb, products);
597
598 static struct usb_driver sr9700_android_driver = {
599         .name = "SR9700_android",
600         .id_table = products,
601         .probe = usbnet_probe,
602         .disconnect = usbnet_disconnect,
603         .suspend = usbnet_suspend,
604         .resume = usbnet_resume,
605 };
606
607 static int __init sr9700_android_init(void)
608 {
609         return usb_register(&sr9700_android_driver);
610 }
611
612 static void __exit sr9700_android_exit(void)
613 {
614         usb_deregister(&sr9700_android_driver);
615 }
616
617 module_init(sr9700_android_init);
618 module_exit(sr9700_android_exit);
619
620 MODULE_AUTHOR("jokeliu <jokeliu@163.com>");
621 MODULE_DESCRIPTION("SR9700 one chip USB 2.0 ethernet devices on android platform");
622 MODULE_LICENSE("GPL");