Bcmnet.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "headers.h"
  2. struct net_device *gblpnetdev;
  3. static INT bcm_open(struct net_device *dev)
  4. {
  5. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  6. if (ad->fw_download_done == false) {
  7. pr_notice(PFX "%s: link up failed (download in progress)\n",
  8. dev->name);
  9. return -EBUSY;
  10. }
  11. if (netif_msg_ifup(ad))
  12. pr_info(PFX "%s: enabling interface\n", dev->name);
  13. if (ad->LinkUpStatus) {
  14. if (netif_msg_link(ad))
  15. pr_info(PFX "%s: link up\n", dev->name);
  16. netif_carrier_on(ad->dev);
  17. netif_start_queue(ad->dev);
  18. }
  19. return 0;
  20. }
  21. static INT bcm_close(struct net_device *dev)
  22. {
  23. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  24. if (netif_msg_ifdown(ad))
  25. pr_info(PFX "%s: disabling interface\n", dev->name);
  26. netif_carrier_off(dev);
  27. netif_stop_queue(dev);
  28. return 0;
  29. }
  30. static u16 bcm_select_queue(struct net_device *dev, struct sk_buff *skb,
  31. void *accel_priv, select_queue_fallback_t fallback)
  32. {
  33. return ClassifyPacket(netdev_priv(dev), skb);
  34. }
  35. /*******************************************************************
  36. * Function - bcm_transmit()
  37. *
  38. * Description - This is the main transmit function for our virtual
  39. * interface(eth0). It handles the ARP packets. It
  40. * clones this packet and then Queue it to a suitable
  41. * Queue. Then calls the transmit_packet().
  42. *
  43. * Parameter - skb - Pointer to the socket buffer structure
  44. * dev - Pointer to the virtual net device structure
  45. *
  46. *********************************************************************/
  47. static netdev_tx_t bcm_transmit(struct sk_buff *skb, struct net_device *dev)
  48. {
  49. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  50. u16 qindex = skb_get_queue_mapping(skb);
  51. if (ad->device_removed || !ad->LinkUpStatus)
  52. goto drop;
  53. if (ad->TransferMode != IP_PACKET_ONLY_MODE)
  54. goto drop;
  55. if (INVALID_QUEUE_INDEX == qindex)
  56. goto drop;
  57. if (ad->PackInfo[qindex].uiCurrentPacketsOnHost >=
  58. SF_MAX_ALLOWED_PACKETS_TO_BACKUP)
  59. return NETDEV_TX_BUSY;
  60. /* Now Enqueue the packet */
  61. if (netif_msg_tx_queued(ad))
  62. pr_info(PFX "%s: enqueueing packet to queue %d\n",
  63. dev->name, qindex);
  64. spin_lock(&ad->PackInfo[qindex].SFQueueLock);
  65. ad->PackInfo[qindex].uiCurrentBytesOnHost += skb->len;
  66. ad->PackInfo[qindex].uiCurrentPacketsOnHost++;
  67. *((B_UINT32 *) skb->cb + SKB_CB_LATENCY_OFFSET) = jiffies;
  68. ENQUEUEPACKET(ad->PackInfo[qindex].FirstTxQueue,
  69. ad->PackInfo[qindex].LastTxQueue, skb);
  70. atomic_inc(&ad->TotalPacketCount);
  71. spin_unlock(&ad->PackInfo[qindex].SFQueueLock);
  72. /* FIXME - this is racy and incorrect, replace with work queue */
  73. if (!atomic_read(&ad->TxPktAvail)) {
  74. atomic_set(&ad->TxPktAvail, 1);
  75. wake_up(&ad->tx_packet_wait_queue);
  76. }
  77. return NETDEV_TX_OK;
  78. drop:
  79. dev_kfree_skb(skb);
  80. return NETDEV_TX_OK;
  81. }
  82. /**
  83. @ingroup init_functions
  84. Register other driver entry points with the kernel
  85. */
  86. static const struct net_device_ops bcmNetDevOps = {
  87. .ndo_open = bcm_open,
  88. .ndo_stop = bcm_close,
  89. .ndo_start_xmit = bcm_transmit,
  90. .ndo_change_mtu = eth_change_mtu,
  91. .ndo_set_mac_address = eth_mac_addr,
  92. .ndo_validate_addr = eth_validate_addr,
  93. .ndo_select_queue = bcm_select_queue,
  94. };
  95. static struct device_type wimax_type = {
  96. .name = "wimax",
  97. };
  98. static int bcm_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
  99. {
  100. cmd->supported = 0;
  101. cmd->advertising = 0;
  102. cmd->speed = SPEED_10000;
  103. cmd->duplex = DUPLEX_FULL;
  104. cmd->port = PORT_TP;
  105. cmd->phy_address = 0;
  106. cmd->transceiver = XCVR_INTERNAL;
  107. cmd->autoneg = AUTONEG_DISABLE;
  108. cmd->maxtxpkt = 0;
  109. cmd->maxrxpkt = 0;
  110. return 0;
  111. }
  112. static void bcm_get_drvinfo(struct net_device *dev,
  113. struct ethtool_drvinfo *info)
  114. {
  115. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  116. struct bcm_interface_adapter *intf_ad = ad->pvInterfaceAdapter;
  117. struct usb_device *udev = interface_to_usbdev(intf_ad->interface);
  118. strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
  119. strlcpy(info->version, DRV_VERSION, sizeof(info->version));
  120. snprintf(info->fw_version, sizeof(info->fw_version), "%u.%u",
  121. ad->uiFlashLayoutMajorVersion,
  122. ad->uiFlashLayoutMinorVersion);
  123. usb_make_path(udev, info->bus_info, sizeof(info->bus_info));
  124. }
  125. static u32 bcm_get_link(struct net_device *dev)
  126. {
  127. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  128. return ad->LinkUpStatus;
  129. }
  130. static u32 bcm_get_msglevel(struct net_device *dev)
  131. {
  132. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  133. return ad->msg_enable;
  134. }
  135. static void bcm_set_msglevel(struct net_device *dev, u32 level)
  136. {
  137. struct bcm_mini_adapter *ad = GET_BCM_ADAPTER(dev);
  138. ad->msg_enable = level;
  139. }
  140. static const struct ethtool_ops bcm_ethtool_ops = {
  141. .get_settings = bcm_get_settings,
  142. .get_drvinfo = bcm_get_drvinfo,
  143. .get_link = bcm_get_link,
  144. .get_msglevel = bcm_get_msglevel,
  145. .set_msglevel = bcm_set_msglevel,
  146. };
  147. int register_networkdev(struct bcm_mini_adapter *ad)
  148. {
  149. struct net_device *net = ad->dev;
  150. struct bcm_interface_adapter *intf_ad = ad->pvInterfaceAdapter;
  151. struct usb_interface *udev = intf_ad->interface;
  152. struct usb_device *xdev = intf_ad->udev;
  153. int result;
  154. net->netdev_ops = &bcmNetDevOps;
  155. net->ethtool_ops = &bcm_ethtool_ops;
  156. net->mtu = MTU_SIZE; /* 1400 Bytes */
  157. net->tx_queue_len = TX_QLEN;
  158. net->flags |= IFF_NOARP;
  159. netif_carrier_off(net);
  160. SET_NETDEV_DEVTYPE(net, &wimax_type);
  161. /* Read the MAC Address from EEPROM */
  162. result = ReadMacAddressFromNVM(ad);
  163. if (result != STATUS_SUCCESS) {
  164. dev_err(&udev->dev,
  165. PFX "Error in Reading the mac Address: %d", result);
  166. return -EIO;
  167. }
  168. result = register_netdev(net);
  169. if (result)
  170. return result;
  171. gblpnetdev = ad->dev;
  172. if (netif_msg_probe(ad))
  173. dev_info(&udev->dev, PFX "%s: register usb-%s-%s %pM\n",
  174. net->name, xdev->bus->bus_name, xdev->devpath,
  175. net->dev_addr);
  176. return 0;
  177. }
  178. void unregister_networkdev(struct bcm_mini_adapter *ad)
  179. {
  180. struct net_device *net = ad->dev;
  181. struct bcm_interface_adapter *intf_ad = ad->pvInterfaceAdapter;
  182. struct usb_interface *udev = intf_ad->interface;
  183. struct usb_device *xdev = intf_ad->udev;
  184. if (netif_msg_probe(ad))
  185. dev_info(&udev->dev, PFX "%s: unregister usb-%s%s\n",
  186. net->name, xdev->bus->bus_name, xdev->devpath);
  187. unregister_netdev(ad->dev);
  188. }