2 * Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/etherdevice.h>
15 #include <asm/byteorder.h>
17 #include <linux/ipv6.h>
18 #include <linux/udp.h>
21 #include "gdm_wimax.h"
24 #include "netlink_k.h"
26 #define gdm_wimax_send(n, d, l) \
27 (n->phy_dev->send_func)(n->phy_dev->priv_dev, d, l, NULL, NULL)
28 #define gdm_wimax_send_with_cb(n, d, l, c, b) \
29 (n->phy_dev->send_func)(n->phy_dev->priv_dev, d, l, c, b)
30 #define gdm_wimax_rcv_with_cb(n, c, b) \
31 (n->phy_dev->rcv_func)(n->phy_dev->priv_dev, c, b)
33 #define EVT_MAX_SIZE 2048
36 struct list_head list;
37 struct net_device *dev;
38 char evt_data[EVT_MAX_SIZE];
42 static void __gdm_wimax_event_send(struct work_struct *work);
43 static inline struct evt_entry *alloc_event_entry(void);
44 static inline void free_event_entry(struct evt_entry *e);
45 static struct evt_entry *get_event_entry(void);
46 static void put_event_entry(struct evt_entry *e);
51 struct list_head evtq;
54 struct list_head freeq;
55 struct work_struct ws;
58 static u8 gdm_wimax_macaddr[6] = {0x00, 0x0a, 0x3b, 0xf0, 0x01, 0x30};
60 static void gdm_wimax_ind_fsm_update(struct net_device *dev, struct fsm_s *fsm);
61 static void gdm_wimax_ind_if_updown(struct net_device *dev, int if_up);
63 #if defined(DEBUG_SDU)
64 static void printk_hex(u8 *buf, u32 size)
68 for (i = 0; i < size; i++) {
70 printk(KERN_DEBUG "\n%02x ", *buf++);
72 printk(KERN_DEBUG "%02x ", *buf++);
75 printk(KERN_DEBUG "\n");
78 static const char *get_protocol_name(u16 protocol)
81 const char *name = "-";
95 sprintf(buf, "0x%04x(%s)", protocol, name);
99 static const char *get_ip_protocol_name(u8 ip_protocol)
102 const char *name = "-";
104 switch (ip_protocol) {
116 sprintf(buf, "%u(%s)", ip_protocol, name);
120 static const char *get_port_name(u16 port)
123 const char *name = "-";
127 name = "DHCP-Server";
130 name = "DHCP-Client";
137 sprintf(buf, "%u(%s)", port, name);
141 static void dump_eth_packet(const char *title, u8 *data, int len)
143 struct iphdr *ih = NULL;
144 struct udphdr *uh = NULL;
149 protocol = (data[12]<<8) | data[13];
150 ih = (struct iphdr *) (data+ETH_HLEN);
152 if (protocol == ETH_P_IP) {
153 uh = (struct udphdr *) ((char *)ih + sizeof(struct iphdr));
154 ip_protocol = ih->protocol;
155 port = ntohs(uh->dest);
156 } else if (protocol == ETH_P_IPV6) {
157 struct ipv6hdr *i6h = (struct ipv6hdr *) data;
158 uh = (struct udphdr *) ((char *)i6h + sizeof(struct ipv6hdr));
159 ip_protocol = i6h->nexthdr;
160 port = ntohs(uh->dest);
163 printk(KERN_DEBUG "[%s] len=%d, %s, %s, %s\n",
165 get_protocol_name(protocol),
166 get_ip_protocol_name(ip_protocol),
167 get_port_name(port));
170 if (!(data[0] == 0xff && data[1] == 0xff)) {
171 if (protocol == ETH_P_IP) {
172 printk(KERN_DEBUG " src=%u.%u.%u.%u\n",
174 } else if (protocol == ETH_P_IPV6) {
176 printk(KERN_DEBUG " src=%x:%x:%x:%x:%x:%x:%x:%x\n",
179 printk(KERN_DEBUG " src=%pI6\n", &ih->saddr);
185 #if (DUMP_PACKET & DUMP_SDU_ALL)
186 printk_hex(data, len);
188 #if (DUMP_PACKET & DUMP_SDU_ARP)
189 if (protocol == ETH_P_ARP)
190 printk_hex(data, len);
192 #if (DUMP_PACKET & DUMP_SDU_IP)
193 if (protocol == ETH_P_IP || protocol == ETH_P_IPV6)
194 printk_hex(data, len);
196 #if (DUMP_PACKET & DUMP_SDU_IP_TCP)
197 if (ip_protocol == IPPROTO_TCP)
198 printk_hex(data, len);
200 #if (DUMP_PACKET & DUMP_SDU_IP_UDP)
201 if (ip_protocol == IPPROTO_UDP)
202 printk_hex(data, len);
204 #if (DUMP_PACKET & DUMP_SDU_IP_ICMP)
205 if (ip_protocol == IPPROTO_ICMP)
206 printk_hex(data, len);
214 static inline int gdm_wimax_header(struct sk_buff **pskb)
216 u16 buf[HCI_HEADER_SIZE / sizeof(u16)];
217 struct sk_buff *skb = *pskb;
220 if (unlikely(skb_headroom(skb) < HCI_HEADER_SIZE)) {
221 struct sk_buff *skb2;
223 skb2 = skb_realloc_headroom(skb, HCI_HEADER_SIZE);
227 skb_set_owner_w(skb2, skb->sk);
232 skb_push(skb, HCI_HEADER_SIZE);
233 buf[0] = H2B(WIMAX_TX_SDU);
234 buf[1] = H2B(skb->len - HCI_HEADER_SIZE);
235 memcpy(skb->data, buf, HCI_HEADER_SIZE);
241 static void gdm_wimax_event_rcv(struct net_device *dev, u16 type, void *msg,
244 struct nic *nic = netdev_priv(dev);
246 #if defined(DEBUG_HCI)
247 u8 *buf = (u8 *) msg;
248 u16 hci_cmd = (buf[0]<<8) | buf[1];
249 u16 hci_len = (buf[2]<<8) | buf[3];
250 printk(KERN_DEBUG "H=>D: 0x%04x(%d)\n", hci_cmd, hci_len);
253 gdm_wimax_send(nic, msg, len);
256 static int gdm_wimax_event_init(void)
258 if (!wm_event.ref_cnt) {
259 wm_event.sock = netlink_init(NETLINK_WIMAX,
260 gdm_wimax_event_rcv);
262 INIT_LIST_HEAD(&wm_event.evtq);
263 INIT_LIST_HEAD(&wm_event.freeq);
264 INIT_WORK(&wm_event.ws, __gdm_wimax_event_send);
265 spin_lock_init(&wm_event.evt_lock);
274 printk(KERN_ERR "Creating WiMax Event netlink is failed\n");
278 static void gdm_wimax_event_exit(void)
280 if (wm_event.sock && --wm_event.ref_cnt == 0) {
281 struct evt_entry *e, *temp;
284 spin_lock_irqsave(&wm_event.evt_lock, flags);
286 list_for_each_entry_safe(e, temp, &wm_event.evtq, list) {
290 list_for_each_entry_safe(e, temp, &wm_event.freeq, list) {
295 spin_unlock_irqrestore(&wm_event.evt_lock, flags);
296 netlink_exit(wm_event.sock);
297 wm_event.sock = NULL;
301 static inline struct evt_entry *alloc_event_entry(void)
303 return kmalloc(sizeof(struct evt_entry), GFP_ATOMIC);
306 static inline void free_event_entry(struct evt_entry *e)
311 static struct evt_entry *get_event_entry(void)
315 if (list_empty(&wm_event.freeq))
316 e = alloc_event_entry();
318 e = list_entry(wm_event.freeq.next, struct evt_entry, list);
325 static void put_event_entry(struct evt_entry *e)
329 list_add_tail(&e->list, &wm_event.freeq);
332 static void __gdm_wimax_event_send(struct work_struct *work)
338 spin_lock_irqsave(&wm_event.evt_lock, flags);
340 while (!list_empty(&wm_event.evtq)) {
341 e = list_entry(wm_event.evtq.next, struct evt_entry, list);
342 spin_unlock_irqrestore(&wm_event.evt_lock, flags);
344 sscanf(e->dev->name, "wm%d", &idx);
345 netlink_send(wm_event.sock, idx, 0, e->evt_data, e->size);
347 spin_lock_irqsave(&wm_event.evt_lock, flags);
352 spin_unlock_irqrestore(&wm_event.evt_lock, flags);
355 static int gdm_wimax_event_send(struct net_device *dev, char *buf, int size)
360 #if defined(DEBUG_HCI)
361 u16 hci_cmd = ((u8)buf[0]<<8) | (u8)buf[1];
362 u16 hci_len = ((u8)buf[2]<<8) | (u8)buf[3];
363 printk(KERN_DEBUG "D=>H: 0x%04x(%d)\n", hci_cmd, hci_len);
366 spin_lock_irqsave(&wm_event.evt_lock, flags);
368 e = get_event_entry();
370 printk(KERN_ERR "%s: No memory for event\n", __func__);
371 spin_unlock_irqrestore(&wm_event.evt_lock, flags);
377 memcpy(e->evt_data, buf, size);
379 list_add_tail(&e->list, &wm_event.evtq);
380 spin_unlock_irqrestore(&wm_event.evt_lock, flags);
382 schedule_work(&wm_event.ws);
387 static void tx_complete(void *arg)
389 struct nic *nic = arg;
391 if (netif_queue_stopped(nic->netdev))
392 netif_wake_queue(nic->netdev);
395 int gdm_wimax_send_tx(struct sk_buff *skb, struct net_device *dev)
398 struct nic *nic = netdev_priv(dev);
400 ret = gdm_wimax_send_with_cb(nic, skb->data, skb->len, tx_complete,
402 if (ret == -ENOSPC) {
403 netif_stop_queue(dev);
408 skb_pull(skb, HCI_HEADER_SIZE);
412 nic->stats.tx_packets++;
413 nic->stats.tx_bytes += skb->len - HCI_HEADER_SIZE;
418 static int gdm_wimax_tx(struct sk_buff *skb, struct net_device *dev)
421 struct nic *nic = netdev_priv(dev);
422 struct fsm_s *fsm = (struct fsm_s *) nic->sdk_data[SIOC_DATA_FSM].buf;
424 #if defined(DEBUG_SDU)
425 dump_eth_packet("TX", skb->data, skb->len);
428 ret = gdm_wimax_header(&skb);
430 skb_pull(skb, HCI_HEADER_SIZE);
434 #if !defined(LOOPBACK_TEST)
436 printk(KERN_ERR "ASSERTION ERROR: fsm is NULL!!\n");
437 else if (fsm->m_status != M_CONNECTED) {
438 printk(KERN_EMERG "ASSERTION ERROR: Device is NOT ready. status=%d\n",
445 #if defined(CONFIG_WIMAX_GDM72XX_QOS)
446 ret = gdm_qos_send_hci_pkt(skb, dev);
448 ret = gdm_wimax_send_tx(skb, dev);
453 static int gdm_wimax_set_config(struct net_device *dev, struct ifmap *map)
455 if (dev->flags & IFF_UP)
461 static void __gdm_wimax_set_mac_addr(struct net_device *dev, char *mac_addr)
463 u16 hci_pkt_buf[32 / sizeof(u16)];
464 u8 *pkt = (u8 *) &hci_pkt_buf[0];
465 struct nic *nic = netdev_priv(dev);
467 /* Since dev is registered as a ethernet device,
468 * ether_setup has made dev->addr_len to be ETH_ALEN
470 memcpy(dev->dev_addr, mac_addr, dev->addr_len);
472 /* Let lower layer know of this change by sending
473 * SetInformation(MAC Address)
475 hci_pkt_buf[0] = H2B(WIMAX_SET_INFO); /* cmd_evt */
476 hci_pkt_buf[1] = H2B(8); /* size */
479 memcpy(pkt + 6, mac_addr, dev->addr_len); /* V */
481 gdm_wimax_send(nic, pkt, HCI_HEADER_SIZE + 8);
484 /* A driver function */
485 static int gdm_wimax_set_mac_addr(struct net_device *dev, void *p)
487 struct sockaddr *addr = p;
489 if (netif_running(dev))
492 if (!is_valid_ether_addr(addr->sa_data))
493 return -EADDRNOTAVAIL;
495 __gdm_wimax_set_mac_addr(dev, addr->sa_data);
500 static struct net_device_stats *gdm_wimax_stats(struct net_device *dev)
502 struct nic *nic = netdev_priv(dev);
507 static int gdm_wimax_open(struct net_device *dev)
509 struct nic *nic = netdev_priv(dev);
510 struct fsm_s *fsm = (struct fsm_s *) nic->sdk_data[SIOC_DATA_FSM].buf;
512 netif_start_queue(dev);
514 if (fsm && fsm->m_status != M_INIT)
515 gdm_wimax_ind_if_updown(dev, 1);
519 static int gdm_wimax_close(struct net_device *dev)
521 struct nic *nic = netdev_priv(dev);
522 struct fsm_s *fsm = (struct fsm_s *) nic->sdk_data[SIOC_DATA_FSM].buf;
524 netif_stop_queue(dev);
526 if (fsm && fsm->m_status != M_INIT)
527 gdm_wimax_ind_if_updown(dev, 0);
531 static void kdelete(void **buf)
539 static int gdm_wimax_ioctl_get_data(struct data_s *dst, struct data_s *src)
543 size = dst->size < src->size ? dst->size : src->size;
549 if (copy_to_user(dst->buf, src->buf, size))
555 static int gdm_wimax_ioctl_set_data(struct data_s *dst, struct data_s *src)
565 if (!(dst->buf && dst->size == src->size)) {
567 dst->buf = kmalloc(src->size, GFP_KERNEL);
568 if (dst->buf == NULL)
572 if (copy_from_user(dst->buf, src->buf, src->size)) {
576 dst->size = src->size;
580 static void gdm_wimax_cleanup_ioctl(struct net_device *dev)
582 struct nic *nic = netdev_priv(dev);
585 for (i = 0; i < SIOC_DATA_MAX; i++)
586 kdelete(&nic->sdk_data[i].buf);
589 static void gdm_update_fsm(struct net_device *dev, struct fsm_s *new_fsm)
591 struct nic *nic = netdev_priv(dev);
592 struct fsm_s *cur_fsm =
593 (struct fsm_s *) nic->sdk_data[SIOC_DATA_FSM].buf;
598 if (cur_fsm->m_status != new_fsm->m_status ||
599 cur_fsm->c_status != new_fsm->c_status) {
600 if (new_fsm->m_status == M_CONNECTED)
601 netif_carrier_on(dev);
602 else if (cur_fsm->m_status == M_CONNECTED) {
603 netif_carrier_off(dev);
604 #if defined(CONFIG_WIMAX_GDM72XX_QOS)
605 gdm_qos_release_list(nic);
608 gdm_wimax_ind_fsm_update(dev, new_fsm);
612 static int gdm_wimax_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
614 struct wm_req_s *req = (struct wm_req_s *) ifr;
615 struct nic *nic = netdev_priv(dev);
618 if (cmd != SIOCWMIOCTL)
624 if (req->data_id >= SIOC_DATA_MAX) {
626 "%s error: data-index(%d) is invalid!!\n",
627 __func__, req->data_id);
630 if (req->cmd == SIOCG_DATA) {
631 ret = gdm_wimax_ioctl_get_data(&req->data,
632 &nic->sdk_data[req->data_id]);
635 } else if (req->cmd == SIOCS_DATA) {
636 if (req->data_id == SIOC_DATA_FSM) {
637 /*NOTE: gdm_update_fsm should be called
638 before gdm_wimax_ioctl_set_data is called*/
640 (struct fsm_s *) req->data.buf);
642 ret = gdm_wimax_ioctl_set_data(
643 &nic->sdk_data[req->data_id], &req->data);
649 printk(KERN_ERR "%s: %x unknown ioctl\n", __func__, cmd);
656 static void gdm_wimax_prepare_device(struct net_device *dev)
658 struct nic *nic = netdev_priv(dev);
659 u16 buf[32 / sizeof(u16)];
660 struct hci_s *hci = (struct hci_s *) buf;
664 #define BIT_MULTI_CS 0
667 #define BIT_AGGREGATION 3
669 /* GetInformation mac address */
671 hci->cmd_evt = H2B(WIMAX_GET_INFO);
672 hci->data[len++] = TLV_T(T_MAC_ADDRESS);
673 hci->length = H2B(len);
674 gdm_wimax_send(nic, hci, HCI_HEADER_SIZE+len);
676 val = (1<<BIT_WIMAX) | (1<<BIT_MULTI_CS);
677 #if defined(CONFIG_WIMAX_GDM72XX_QOS)
680 #if defined(CONFIG_WIMAX_GDM72XX_WIMAX2)
681 val |= (1<<BIT_AGGREGATION);
686 hci->cmd_evt = H2B(WIMAX_SET_INFO);
687 hci->data[len++] = TLV_T(T_CAPABILITY);
688 hci->data[len++] = TLV_L(T_CAPABILITY);
690 memcpy(&hci->data[len], &val, TLV_L(T_CAPABILITY));
691 len += TLV_L(T_CAPABILITY);
692 hci->length = H2B(len);
693 gdm_wimax_send(nic, hci, HCI_HEADER_SIZE+len);
695 printk(KERN_INFO "GDM WiMax Set CAPABILITY: 0x%08X\n", DB2H(val));
698 static int gdm_wimax_hci_get_tlv(u8 *buf, u8 *T, u16 *L, u8 **V)
700 #define __U82U16(b) ((u16)((u8 *)(b))[0] | ((u16)((u8 *)(b))[1] << 8))
704 if (buf[1] == 0x82) {
705 *L = B2H(__U82U16(&buf[2]));
706 next_pos = 1/*type*/+3/*len*/;
709 next_pos = 1/*type*/+1/*len*/;
713 next_pos += *L/*length of val*/;
717 static int gdm_wimax_get_prepared_info(struct net_device *dev, char *buf,
722 u16 cmd_evt, cmd_len;
723 int pos = HCI_HEADER_SIZE;
725 cmd_evt = B2H(*(u16 *)&buf[0]);
726 cmd_len = B2H(*(u16 *)&buf[2]);
728 if (len < cmd_len + HCI_HEADER_SIZE) {
729 printk(KERN_ERR "%s: invalid length [%d/%d]\n", __func__,
730 cmd_len + HCI_HEADER_SIZE, len);
734 if (cmd_evt == WIMAX_GET_INFO_RESULT) {
736 printk(KERN_ERR "%s: len is too short [%x/%d]\n",
737 __func__, cmd_evt, len);
741 pos += gdm_wimax_hci_get_tlv(&buf[pos], &T, &L, &V);
742 if (T == TLV_T(T_MAC_ADDRESS)) {
743 if (L != dev->addr_len) {
745 "%s Invalid inofrmation result T/L "
746 "[%x/%d]\n", __func__, T, L);
749 printk(KERN_INFO "MAC change [%pM]->[%pM]\n",
751 memcpy(dev->dev_addr, V, dev->addr_len);
756 gdm_wimax_event_send(dev, buf, len);
760 static void gdm_wimax_netif_rx(struct net_device *dev, char *buf, int len)
762 struct nic *nic = netdev_priv(dev);
766 #if defined(DEBUG_SDU)
767 dump_eth_packet("RX", buf, len);
770 skb = dev_alloc_skb(len + 2);
772 printk(KERN_ERR "%s: dev_alloc_skb failed!\n", __func__);
777 nic->stats.rx_packets++;
778 nic->stats.rx_bytes += len;
780 memcpy(skb_put(skb, len), buf, len);
783 skb->protocol = eth_type_trans(skb, dev); /* what will happen? */
785 ret = in_interrupt() ? netif_rx(skb) : netif_rx_ni(skb);
786 if (ret == NET_RX_DROP)
787 printk(KERN_ERR "%s skb dropped\n", __func__);
790 static void gdm_wimax_transmit_aggr_pkt(struct net_device *dev, char *buf,
793 #define HCI_PADDING_BYTE 4
794 #define HCI_RESERVED_BYTE 4
799 hci = (struct hci_s *) buf;
801 if (B2H(hci->cmd_evt) != WIMAX_RX_SDU) {
802 printk(KERN_ERR "Wrong cmd_evt(0x%04X)\n",
807 length = B2H(hci->length);
808 gdm_wimax_netif_rx(dev, hci->data, length);
811 /* Add padding size */
812 length += HCI_PADDING_BYTE - (length & 0x3);
815 length += HCI_HEADER_SIZE + HCI_RESERVED_BYTE;
821 static void gdm_wimax_transmit_pkt(struct net_device *dev, char *buf, int len)
823 #if defined(CONFIG_WIMAX_GDM72XX_QOS)
824 struct nic *nic = netdev_priv(dev);
826 u16 cmd_evt, cmd_len;
828 /* This code is added for certain rx packet to be ignored. */
832 cmd_evt = B2H(*(u16 *)&buf[0]);
833 cmd_len = B2H(*(u16 *)&buf[2]);
835 if (len < cmd_len + HCI_HEADER_SIZE) {
837 printk(KERN_ERR "%s: invalid length [%d/%d]\n",
838 __func__, cmd_len + HCI_HEADER_SIZE, len);
843 case WIMAX_RX_SDU_AGGR:
844 gdm_wimax_transmit_aggr_pkt(dev, &buf[HCI_HEADER_SIZE],
848 gdm_wimax_netif_rx(dev, &buf[HCI_HEADER_SIZE], cmd_len);
850 #if defined(CONFIG_WIMAX_GDM72XX_QOS)
851 case WIMAX_EVT_MODEM_REPORT:
852 gdm_recv_qos_hci_packet(nic, buf, len);
855 case WIMAX_SDU_TX_FLOW:
857 if (!netif_queue_stopped(dev))
858 netif_stop_queue(dev);
859 } else if (buf[4] == 1) {
860 if (netif_queue_stopped(dev))
861 netif_wake_queue(dev);
865 gdm_wimax_event_send(dev, buf, len);
870 static void gdm_wimax_ind_fsm_update(struct net_device *dev, struct fsm_s *fsm)
872 u16 buf[32 / sizeof(u16)];
873 u8 *hci_pkt_buf = (u8 *)&buf[0];
875 /* Indicate updating fsm */
876 buf[0] = H2B(WIMAX_FSM_UPDATE);
877 buf[1] = H2B(sizeof(struct fsm_s));
878 memcpy(&hci_pkt_buf[HCI_HEADER_SIZE], fsm, sizeof(struct fsm_s));
880 gdm_wimax_event_send(dev, hci_pkt_buf,
881 HCI_HEADER_SIZE + sizeof(struct fsm_s));
884 static void gdm_wimax_ind_if_updown(struct net_device *dev, int if_up)
886 u16 buf[32 / sizeof(u16)];
887 struct hci_s *hci = (struct hci_s *) buf;
888 unsigned char up_down;
890 up_down = if_up ? WIMAX_IF_UP : WIMAX_IF_DOWN;
892 /* Indicate updating fsm */
893 hci->cmd_evt = H2B(WIMAX_IF_UPDOWN);
894 hci->length = H2B(sizeof(up_down));
895 hci->data[0] = up_down;
897 gdm_wimax_event_send(dev, (char *)hci, HCI_HEADER_SIZE+sizeof(up_down));
900 static void rx_complete(void *arg, void *data, int len)
902 struct nic *nic = arg;
904 gdm_wimax_transmit_pkt(nic->netdev, data, len);
905 gdm_wimax_rcv_with_cb(nic, rx_complete, nic);
908 static void prepare_rx_complete(void *arg, void *data, int len)
910 struct nic *nic = arg;
913 ret = gdm_wimax_get_prepared_info(nic->netdev, data, len);
915 gdm_wimax_rcv_with_cb(nic, rx_complete, nic);
918 printk(KERN_ERR "get_prepared_info failed(%d)\n", ret);
919 gdm_wimax_rcv_with_cb(nic, prepare_rx_complete, nic);
921 /* Re-prepare WiMax device */
922 gdm_wimax_prepare_device(nic->netdev);
927 static void start_rx_proc(struct nic *nic)
929 gdm_wimax_rcv_with_cb(nic, prepare_rx_complete, nic);
932 static struct net_device_ops gdm_netdev_ops = {
933 .ndo_open = gdm_wimax_open,
934 .ndo_stop = gdm_wimax_close,
935 .ndo_set_config = gdm_wimax_set_config,
936 .ndo_start_xmit = gdm_wimax_tx,
937 .ndo_get_stats = gdm_wimax_stats,
938 .ndo_set_mac_address = gdm_wimax_set_mac_addr,
939 .ndo_do_ioctl = gdm_wimax_ioctl,
942 int register_wimax_device(struct phy_dev *phy_dev, struct device *pdev)
944 struct nic *nic = NULL;
945 struct net_device *dev;
948 dev = (struct net_device *)alloc_netdev(sizeof(*nic),
949 "wm%d", ether_setup);
952 printk(KERN_ERR "alloc_etherdev failed\n");
956 SET_NETDEV_DEV(dev, pdev);
958 dev->netdev_ops = &gdm_netdev_ops;
959 dev->flags &= ~IFF_MULTICAST;
960 memcpy(dev->dev_addr, gdm_wimax_macaddr, sizeof(gdm_wimax_macaddr));
962 nic = netdev_priv(dev);
963 memset(nic, 0, sizeof(*nic));
966 nic->phy_dev = phy_dev;
967 phy_dev->netdev = dev;
969 /* event socket init */
970 ret = gdm_wimax_event_init();
972 printk(KERN_ERR "Cannot create event.\n");
976 ret = register_netdev(dev);
980 #if defined(LOOPBACK_TEST)
981 netif_start_queue(dev);
982 netif_carrier_on(dev);
984 netif_carrier_off(dev);
987 #ifdef CONFIG_WIMAX_GDM72XX_QOS
993 /* Prepare WiMax device */
994 gdm_wimax_prepare_device(dev);
999 printk(KERN_ERR "register_netdev failed\n");
1004 void unregister_wimax_device(struct phy_dev *phy_dev)
1006 struct nic *nic = netdev_priv(phy_dev->netdev);
1007 struct fsm_s *fsm = (struct fsm_s *) nic->sdk_data[SIOC_DATA_FSM].buf;
1010 fsm->m_status = M_INIT;
1011 unregister_netdev(nic->netdev);
1013 gdm_wimax_event_exit();
1015 #if defined(CONFIG_WIMAX_GDM72XX_QOS)
1016 gdm_qos_release_list(nic);
1019 gdm_wimax_cleanup_ioctl(phy_dev->netdev);
1021 free_netdev(nic->netdev);