Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682692
  • 博文数量: 516
  • 博客积分: 4119
  • 博客等级: 上校
  • 技术积分: 4288
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 17:29
文章分类

全部博文(516)

文章存档

2014年(4)

2013年(160)

2012年(352)

分类:

2013-01-04 17:12:23

原文地址:AX88796b Linux驱动移植 作者:chenxibing008


AX88796B网卡for OMAP3530 + Linux 2.6.29平台

到asix网站下载了最新的ax88796b驱动,放到drivers/net/目录下,修改了Makefile和Kconfig文件。
直接编译出现一大堆的错误:
error: 'struct net_device' has no member named 'priv'

驱动本身好像没有支持这么新的内核,而新的内核net_device结构发生了变化,看/include/linux/netdevice.h文件:

这是2.6.31的net_device结构体,2.6.29和这个基本相同:


 649struct net_device
 650{
 651
 652 /*
 653 * This is the first field of the "visible" part of this structure
 654 * (i.e. as seen by users in the "Space.c" file). It is the name
 655 * the interface.
 656 */

 657 char name[IFNAMSIZ];
 658 /* device name hash chain */
 659 struct hlist_node name_hlist;
 660 /* snmp alias */
 661 char *ifalias;
 662
 663 /*
 664 * I/O specific fields
 665 * FIXME: Merge these and struct ifmap into one
 666 */

 667 unsigned long mem_end; /* shared mem end */
 668 unsigned long mem_start; /* shared mem start */
 669 unsigned long base_addr; /* device I/O address */
 670 unsigned int irq; /* device IRQ number */
 671
 672 /*
 673 * Some hardware also needs these fields, but they are not
 674 * part of the usual set specified in Space.c.
 675 */

 676
 677 unsigned char if_port; /* Selectable AUI, TP,..*/
 678 unsigned char dma; /* DMA channel */
 679
 680 unsigned long state;
 681
 682 struct list_head dev_list;
 683 struct list_head napi_list;
 684
 685 /* Net device features */
 686 unsigned long features;
 687#define NETIF_F_SG 1 /* Scatter/gather IO. */
 688#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */
 689#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */
 690#define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */
 691#define NETIF_F_IPV6_CSUM 16 /* Can checksum TCP/UDP over IPV6 */
 692#define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */
 693#define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */
 694#define NETIF_F_HW_VLAN_TX 128 /* Transmit VLAN hw acceleration */
 695#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */
 696#define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */
 697#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */
 698#define NETIF_F_GSO 2048 /* Enable software GSO. */
 699#define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */
 700 /* do not use LLTX in new drivers */
 701#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
 702#define NETIF_F_GRO 16384 /* Generic receive offload */
 703#define NETIF_F_LRO 32768 /* large receive offload */
 704
 705/* the GSO_MASK reserves bits 16 through 23 */
 706#define NETIF_F_FCOE_CRC (1 << 24) /* FCoE CRC32 */
 707#define NETIF_F_SCTP_CSUM (1 << 25) /* SCTP checksum offload */
 708
 709 /* Segmentation offload features */
 710#define NETIF_F_GSO_SHIFT 16
 711#define NETIF_F_GSO_MASK 0x00ff0000
 712#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
 713#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
 714#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
 715#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
 716#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
 717#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
 718
 719 /* List of features with software fallbacks. */
 720#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
 721
 722
 723#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
 724#define NETIF_F_V4_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
 725#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
 726#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
 727
 728 /*
 729 * If one device supports one of these features, then enable them
 730 * for all in netdev_increment_features.
 731 */

 732#define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
 733 NETIF_F_SG | NETIF_F_HIGHDMA | \
 734 NETIF_F_FRAGLIST)
 735
 736 /* Interface index. Unique device identifier */
 737 int ifindex;
 738 int iflink;
 739
 740 struct net_device_stats stats;
 741
 742#ifdef CONFIG_WIRELESS_EXT
 743 /* List of functions to handle Wireless Extensions (instead of ioctl).
 744 * See for details. Jean II */

 745 const struct iw_handler_def * wireless_handlers;
 746 /* Instance data managed by the core of Wireless Extensions. */
 747 struct iw_public_data * wireless_data;
 748#endif
 749 /* Management operations */
 750 const struct net_device_ops *netdev_ops;
 751 const struct ethtool_ops *ethtool_ops;
 752
 753 /* Hardware header description */
 754 const struct header_ops *header_ops;
 755
 756 unsigned int flags; /* interface flags (a la BSD) */
 757 unsigned short gflags;
 758 unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */
 759 unsigned short padded; /* How much padding added by alloc_netdev() */
 760
 761 unsigned char operstate; /* RFC2863 operstate */
 762 unsigned char link_mode; /* mapping policy to operstate */
 763
 764 unsigned mtu; /* interface MTU value */
 765 unsigned short type; /* interface hardware type */
 766 unsigned short hard_header_len; /* hardware hdr length */
 767
 768 /* extra head- and tailroom the hardware may need, but not in all cases
 769 * can this be guaranteed, especially tailroom. Some cases also use
 770 * LL_MAX_HEADER instead to allocate the skb.
 771 */

 772 unsigned short needed_headroom;
 773 unsigned short needed_tailroom;
 774
 775 struct net_device *master; /* Pointer to master device of a group,
 776 * which this device is member of.
 777 */

 778
 779 /* Interface address info. */
 780 unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
 781 unsigned char addr_len; /* hardware address length */
 782 unsigned short dev_id; /* for shared network cards */
 783
 784 struct netdev_hw_addr_list uc; /* Secondary unicast
 785 mac addresses */

 786 int uc_promisc;
 787 spinlock_t addr_list_lock;
 788 struct dev_addr_list *mc_list; /* Multicast mac addresses */
 789 int mc_count; /* Number of installed mcasts */
 790 unsigned int promiscuity;
 791 unsigned int allmulti;
 792
 793
 794 /* Protocol specific pointers */
 795
 796#ifdef CONFIG_NET_DSA
 797 void *dsa_ptr; /* dsa specific data */
 798#endif
 799 void *atalk_ptr; /* AppleTalk link */
 800 void *ip_ptr; /* IPv4 specific data */
 801 void *dn_ptr; /* DECnet specific data */
 802 void *ip6_ptr; /* IPv6 specific data */
 803 void *ec_ptr; /* Econet specific data */
 804 void *ax25_ptr; /* AX.25 specific data */
 805 struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
 806 assign before registering */

 807
 808/*
 809 * Cache line mostly used on receive path (including eth_type_trans())
 810 */

 811 unsigned long last_rx; /* Time of last Rx */
 812 /* Interface address info used in eth_type_trans() */
 813 unsigned char *dev_addr; /* hw address, (before bcast
 814 because most packets are
 815 unicast) */

 816
 817 struct netdev_hw_addr_list dev_addrs; /* list of device
 818 hw addresses */

 819
 820 unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
 821
 822 struct netdev_queue rx_queue;
 823
 824 struct netdev_queue *_tx ____cacheline_aligned_in_smp;
 825
 826 /* Number of TX queues allocated at alloc_netdev_mq() time */
 827 unsigned int num_tx_queues;
 828
 829 /* Number of TX queues currently active in device */
 830 unsigned int real_num_tx_queues;
 831
 832 unsigned long tx_queue_len; /* Max frames per queue allowed */
 833 spinlock_t tx_global_lock;
 834/*
 835 * One part is mostly used on xmit path (device)
 836 */

 837 /* These may be needed for future network-power-down code. */
 838
 839 /*
 840 * trans_start here is expensive for high speed devices on SMP,
 841 * please use netdev_queue->trans_start instead.
 842 */

 843 unsigned long trans_start; /* Time (in jiffies) of last Tx */
 844
 845 int watchdog_timeo; /* used by dev_watchdog() */
 846 struct timer_list watchdog_timer;
 847
 848 /* Number of references to this device */
 849 atomic_t refcnt ____cacheline_aligned_in_smp;
 850
 851 /* delayed register/unregister */
 852 struct list_head todo_list;
 853 /* device index hash chain */
 854 struct hlist_node index_hlist;
 855
 856 struct net_device *link_watch_next;
 857
 858 /* register/unregister state machine */
 859 enum { NETREG_UNINITIALIZED=0,
 860 NETREG_REGISTERED, /* completed register_netdevice */
 861 NETREG_UNREGISTERING, /* called unregister_netdevice */
 862 NETREG_UNREGISTERED, /* completed unregister todo */
 863 NETREG_RELEASED, /* called free_netdev */
 864 NETREG_DUMMY, /* dummy device for NAPI poll */
 865 } reg_state;
 866
 867 /* Called from unregister, can be used to call free_netdev */
 868 void (*destructor)(struct net_device *dev);
 869
 870#ifdef CONFIG_NETPOLL
 871 struct netpoll_info *npinfo;
 872#endif
 873
 874#ifdef CONFIG_NET_NS
 875 /* Network namespace this network device is inside */
 876 struct net *nd_net;
 877#endif
 878
 879 /* mid-layer private */
 880 void *ml_priv;
 881
 882 /* bridge stuff */
 883 struct net_bridge_port *br_port;
 884 /* macvlan */
 885 struct macvlan_port *macvlan_port;
 886 /* GARP */
 887 struct garp_port *garp_port;
 888
 889 /* class/net/name entry */
 890 struct device dev;
 891 /* space for optional statistics and wireless sysfs groups */
 892 struct attribute_group *sysfs_groups[3];
 893
 894 /* rtnetlink link ops */
 895 const struct rtnl_link_ops *rtnl_link_ops;
 896
 897 /* VLAN feature mask */
 898 unsigned long vlan_features;
 899
 900 /* for setting kernel sock attribute on TCP connection setup */
 901#define GSO_MAX_SIZE 65536
 902 unsigned int gso_max_size;
 903
 904#ifdef CONFIG_DCB
 905 /* Data Center Bridging netlink ops */
 906 struct dcbnl_rtnl_ops *dcbnl_ops;
 907#endif
 908
 909#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
 910 /* max exchange id for FCoE LRO by ddp */
 911 unsigned int fcoe_ddp_xid;
 912#endif
 913};



这是2.6.28的net_device结构体,很显然,其中有
 657 void *priv; /* pointer to private data */
priv这个成员。

465struct net_device
 466{
 467
 468 /*
 469 * This is the first field of the "visible" part of this structure
 470 * (i.e. as seen by users in the "Space.c" file). It is the name
 471 * the interface.
 472 */

 473 char name[IFNAMSIZ];
 474 /* device name hash chain */
 475 struct hlist_node name_hlist;
 476 /* snmp alias */
 477 char *ifalias;
 478
 479 /*
 480 * I/O specific fields
 481 * FIXME: Merge these and struct ifmap into one
 482 */

 483 unsigned long mem_end; /* shared mem end */
 484 unsigned long mem_start; /* shared mem start */
 485 unsigned long base_addr; /* device I/O address */
 486 unsigned int irq; /* device IRQ number */
 487
 488 /*
 489 * Some hardware also needs these fields, but they are not
 490 * part of the usual set specified in Space.c.
 491 */

 492
 493 unsigned char if_port; /* Selectable AUI, TP,..*/
 494 unsigned char dma; /* DMA channel */
 495
 496 unsigned long state;
 497
 498 struct list_head dev_list;
 499#ifdef CONFIG_NETPOLL
 500 struct list_head napi_list;
 501#endif
 502
 503 /* The device initialization function. Called only once. */
 504 int (*init)(struct net_device *dev);
 505
 506 /* ------- Fields preinitialized in Space.c finish here ------- */
 507
 508 /* Net device features */
 509 unsigned long features;
 510#define NETIF_F_SG 1 /* Scatter/gather IO. */
 511#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */
 512#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */
 513#define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */
 514#define NETIF_F_IPV6_CSUM 16 /* Can checksum TCP/UDP over IPV6 */
 515#define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */
 516#define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */
 517#define NETIF_F_HW_VLAN_TX 128 /* Transmit VLAN hw acceleration */
 518#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */
 519#define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */
 520#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */
 521#define NETIF_F_GSO 2048 /* Enable software GSO. */
 522#define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */
 523 /* do not use LLTX in new drivers */
 524#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
 525#define NETIF_F_LRO 32768 /* large receive offload */
 526
 527 /* Segmentation offload features */
 528#define NETIF_F_GSO_SHIFT 16
 529#define NETIF_F_GSO_MASK 0xffff0000
 530#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
 531#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
 532#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
 533#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
 534#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
 535
 536 /* List of features with software fallbacks. */
 537#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
 538
 539
 540#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
 541#define NETIF_F_V4_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
 542#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
 543#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
 544
 545 /*
 546 * If one device supports one of these features, then enable them
 547 * for all in netdev_increment_features.
 548 */

 549#define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
 550 NETIF_F_SG | NETIF_F_HIGHDMA | \
 551 NETIF_F_FRAGLIST)
 552
 553 /* Interface index. Unique device identifier */
 554 int ifindex;
 555 int iflink;
 556
 557
 558 struct net_device_stats* (*get_stats)(struct net_device *dev);
 559 struct net_device_stats stats;
 560
 561#ifdef CONFIG_WIRELESS_EXT
 562 /* List of functions to handle Wireless Extensions (instead of ioctl).
 563 * See for details. Jean II */

 564 const struct iw_handler_def * wireless_handlers;
 565 /* Instance data managed by the core of Wireless Extensions. */
 566 struct iw_public_data * wireless_data;
 567#endif
 568 const struct ethtool_ops *ethtool_ops;
 569
 570 /* Hardware header description */
 571 const struct header_ops *header_ops;
 572
 573 /*
 574 * This marks the end of the "visible" part of the structure. All
 575 * fields hereafter are internal to the system, and may change at
 576 * will (read: may be cleaned up at will).
 577 */

 578
 579
 580 unsigned int flags; /* interface flags (a la BSD) */
 581 unsigned short gflags;
 582 unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */
 583 unsigned short padded; /* How much padding added by alloc_netdev() */
 584
 585 unsigned char operstate; /* RFC2863 operstate */
 586 unsigned char link_mode; /* mapping policy to operstate */
 587
 588 unsigned mtu; /* interface MTU value */
 589 unsigned short type; /* interface hardware type */
 590 unsigned short hard_header_len; /* hardware hdr length */
 591
 592 /* extra head- and tailroom the hardware may need, but not in all cases
 593 * can this be guaranteed, especially tailroom. Some cases also use
 594 * LL_MAX_HEADER instead to allocate the skb.
 595 */

 596 unsigned short needed_headroom;
 597 unsigned short needed_tailroom;
 598
 599 struct net_device *master; /* Pointer to master device of a group,
 600 * which this device is member of.
 601 */

 602
 603 /* Interface address info. */
 604 unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
 605 unsigned char addr_len; /* hardware address length */
 606 unsigned short dev_id; /* for shared network cards */
 607
 608 spinlock_t addr_list_lock;
 609 struct dev_addr_list *uc_list; /* Secondary unicast mac addresses */
 610 int uc_count; /* Number of installed ucasts */
 611 int uc_promisc;
 612 struct dev_addr_list *mc_list; /* Multicast mac addresses */
 613 int mc_count; /* Number of installed mcasts */
 614 unsigned int promiscuity;
 615 unsigned int allmulti;
 616
 617
 618 /* Protocol specific pointers */
 619
 620#ifdef CONFIG_NET_DSA
 621 void *dsa_ptr; /* dsa specific data */
 622#endif
 623 void *atalk_ptr; /* AppleTalk link */
 624 void *ip_ptr; /* IPv4 specific data */
 625 void *dn_ptr; /* DECnet specific data */
 626 void *ip6_ptr; /* IPv6 specific data */
 627 void *ec_ptr; /* Econet specific data */
 628 void *ax25_ptr; /* AX.25 specific data */
 629 struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
 630 assign before registering */

 631
 632/*
 633 * Cache line mostly used on receive path (including eth_type_trans())
 634 */

 635 unsigned long last_rx; /* Time of last Rx */
 636 /* Interface address info used in eth_type_trans() */
 637 unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast
 638 because most packets are unicast) */

 639
 640 unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
 641
 642 struct netdev_queue rx_queue;
 643
 644 struct netdev_queue *_tx ____cacheline_aligned_in_smp;
 645
 646 /* Number of TX queues allocated at alloc_netdev_mq() time */
 647 unsigned int num_tx_queues;
 648
 649 /* Number of TX queues currently active in device */
 650 unsigned int real_num_tx_queues;
 651
 652 unsigned long tx_queue_len; /* Max frames per queue allowed */
 653 spinlock_t tx_global_lock;
 654/*
 655 * One part is mostly used on xmit path (device)
 656 */

 657 void *priv; /* pointer to private data */
 658 int (*hard_start_xmit) (struct sk_buff *skb,
 659 struct net_device *dev);
 660 /* These may be needed for future network-power-down code. */
 661 unsigned long trans_start; /* Time (in jiffies) of last Tx */
 662
 663 int watchdog_timeo; /* used by dev_watchdog() */
 664 struct timer_list watchdog_timer;
 665
 666/*
 667 * refcnt is a very hot point, so align it on SMP
 668 */

 669 /* Number of references to this device */
 670 atomic_t refcnt ____cacheline_aligned_in_smp;
 671
 672 /* delayed register/unregister */
 673 struct list_head todo_list;
 674 /* device index hash chain */
 675 struct hlist_node index_hlist;
 676
 677 struct net_device *link_watch_next;
 678
 679 /* register/unregister state machine */
 680 enum { NETREG_UNINITIALIZED=0,
 681 NETREG_REGISTERED, /* completed register_netdevice */
 682 NETREG_UNREGISTERING, /* called unregister_netdevice */
 683 NETREG_UNREGISTERED, /* completed unregister todo */
 684 NETREG_RELEASED, /* called free_netdev */
 685 } reg_state;
 686
 687 /* Called after device is detached from network. */
 688 void (*uninit)(struct net_device *dev);
 689 /* Called after last user reference disappears. */
 690 void (*destructor)(struct net_device *dev);
 691
 692 /* Pointers to interface service routines. */
 693 int (*open)(struct net_device *dev);
 694 int (*stop)(struct net_device *dev);
 695#define HAVE_NETDEV_POLL
 696#define HAVE_CHANGE_RX_FLAGS
 697 void (*change_rx_flags)(struct net_device *dev,
 698 int flags);
 699#define HAVE_SET_RX_MODE
 700 void (*set_rx_mode)(struct net_device *dev);
 701#define HAVE_MULTICAST
 702 void (*set_multicast_list)(struct net_device *dev);
 703#define HAVE_SET_MAC_ADDR
 704 int (*set_mac_address)(struct net_device *dev,
 705 void *addr);
 706#define HAVE_VALIDATE_ADDR
 707 int (*validate_addr)(struct net_device *dev);
 708#define HAVE_PRIVATE_IOCTL
 709 int (*do_ioctl)(struct net_device *dev,
 710 struct ifreq *ifr, int cmd);
 711#define HAVE_SET_CONFIG
 712 int (*set_config)(struct net_device *dev,
 713 struct ifmap *map);
 714#define HAVE_CHANGE_MTU
 715 int (*change_mtu)(struct net_device *dev, int new_mtu);
 716
 717#define HAVE_TX_TIMEOUT
 718 void (*tx_timeout) (struct net_device *dev);
 719
 720 void (*vlan_rx_register)(struct net_device *dev,
 721 struct vlan_group *grp);
 722 void (*vlan_rx_add_vid)(struct net_device *dev,
 723 unsigned short vid);
 724 void (*vlan_rx_kill_vid)(struct net_device *dev,
 725 unsigned short vid);
 726
 727 int (*neigh_setup)(struct net_device *dev, struct neigh_parms *);
 728#ifdef CONFIG_NETPOLL
 729 struct netpoll_info *npinfo;
 730#endif
 731#ifdef CONFIG_NET_POLL_CONTROLLER
 732 void (*poll_controller)(struct net_device *dev);
 733#endif
 734
 735 u16 (*select_queue)(struct net_device *dev,
 736 struct sk_buff *skb);
 737
 738#ifdef CONFIG_NET_NS
 739 /* Network namespace this network device is inside */
 740 struct net *nd_net;
 741#endif
 742
 743 /* mid-layer private */
 744 void *ml_priv;
 745
 746 /* bridge stuff */
 747 struct net_bridge_port *br_port;
 748 /* macvlan */
 749 struct macvlan_port *macvlan_port;
 750 /* GARP */
 751 struct garp_port *garp_port;
 752
 753 /* class/net/name entry */
 754 struct device dev;
 755 /* space for optional statistics and wireless sysfs groups */
 756 struct attribute_group *sysfs_groups[3];
 757
 758 /* rtnetlink link ops */
 759 const struct rtnl_link_ops *rtnl_link_ops;
 760
 761 /* VLAN feature mask */
 762 unsigned long vlan_features;
 763
 764 /* for setting kernel sock attribute on TCP connection setup */
 765#define GSO_MAX_SIZE 65536
 766 unsigned int gso_max_size;
 767};




改动:

把原来的: 

struct ax_device *ax_local = (struct ax_device *) dev->priv;

改成:
 struct ax_device *ax_local = netdev_priv(dev);

编译的错误就没有了。

这样编译后,系统无法发现设备,就算已经配置好硬件,都是不行的。
后来增加了8390.c的编译,可以找到网卡了:
AX88796B: MAC ADDRESS  00 88 88 77 99 66
eth%d: AX88796B found at 0x15000000, using IRQ 174.
AX88796B:  The media mode is autosense.
eth0 (): not using net_device_ops yet 
两个问题:一是第一次识别的网卡是eth%d,第二次识别到了eth0,二是出现not using net_device_ops的警告。
./net/core/dev.c:    pr_info("%s (%s): not using net_device_ops yet\n",


ping不通,用抓包软件看,电脑能够收到ping包,并且也回应了,但是板子收不到任何东西,lost 100%。
在中断服务程序中打印,结果没有打印出来,很显然没有进入中段程序。中断设置有问题。

在./arch/arm/plat-omap/include/mach/mux.h文件的enum omap34xx_index 增加了:
 GPIO14, /* for NET_IRQ */

在./arch/arm/mach-omap2/mux.c的static struct pin_config __initdata_or_module omap34xx_pins 增加了:

MUX_CFG_34XX("GPIO14", 0x5dc,
     OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP) /* for NET_IRQ */

在arch/arm/mach-omap2/board-omap3beagle.c中增加:

omap_cfg_reg(GPIO14); //

        if (gpio_request(EPCARM3500_ETHR_GPIO_IRQ, "ax88796b irq") < 0) {
                 printk(KERN_ERR "Failed to request GPIO%d for ax88796b IRQ\n",
                        EPCARM3500_ETHR_GPIO_IRQ);
                return;
        }
        gpio_direction_input(EPCARM3500_ETHR_GPIO_IRQ);

        set_irq_type(OMAP_GPIO_IRQ(14), IRQ_TYPE_EDGE_RISING);
        enable_irq(gpio_to_irq(14));

        omap_cfg_reg(GPIO133); //

        gpio_direction_output(133, 0);
        mdelay(3);
        gpio_direction_output(133, 1);


依然没有发生中断。

其实是中断引脚电平没有变化,始终是低电平,用表笔将IRQ和V1.8V碰一下,就可以产生中断,并且ping通。
到底是什么原因导致出现这样的情况,还不清楚。

先后找了OMAP IO设置和中断设置,都没有发现问题,后来怀疑是AX88796B的设置问题,经过咨询,可能是IRQ 类型设置的问题:BTCR(page3 0x15),bit4设置IRQ极性,bit5设置IRQ类型。
默认是0,低电平,改为1(push-pull)后中断正常。

writeb (0x30, ax_base + EN0_BTCR); 

不过还有怀疑的是,在PXA270和s3c24402440上使用低电平是没有问题的。

伪中断:不过现在出现这样的警告:
Spurious irq 95: 0xffffffdf, please flush posted write for irq 29

arch/arm/mach-omap2/irq.c文件中打印出来:
./arch/arm/mach-omap2/irq.c:            printk(KERN_WARNING "Spurious irq %i: 0x%08x, please flush "

注释掉用于测试的_REG和SD WP的IO的中断的代码后,伪中断少了很多。


这和网卡驱动没有任何关系,是TI移植包的问题:

在新版的OMAP35x_DVSDK_Build_v3.00.02.44中好像没有这个问题了。



 系统网卡侦测表drivers/net/Space.c使用方法。

ax88796b驱动中有init_module函数:

int init_module (void)

{

    struct net_device *dev = &dev_ax;



    dev->irq = irq;

    dev->base_addr = mem;

    dev->init = ax_probe;

    if (register_netdev (dev) == 0)

        return 0;



    if (mem != 0) {

        PRINTK (WARNING_MSG, PFX " No AX88796B card found at memory = %#x\n", mem);

    }

    else {

        PRINTK (WARNING_MSG, PFX
            " You must supply \"mem=0xNNNNNNN\""
            " value(s) for AX88796B.\n");

    }

    return -ENXIO;

}


也有一个__ini ax_kprobe函数,也是驱动的入口:

struct net_device * __init ax_kprobe (int unit)

{

    struct net_device *dev = alloc_ei_netdev ();

    int err;



    if (!dev)

        return ERR_PTR (-ENOMEM);



    sprintf (dev->name, "eth%d", unit);

    netdev_boot_setup_check (dev);



    err = ax_probe (dev);

    if (err)

        goto out;

    return dev;

out:

    free_netdev (dev);

    return ERR_PTR (err);

}


如果使用模块方式编译,或者强制使用init_modul作为入口时可以的,也可以使用ax_kprobe作为入口,不过这样的话,就需要在net/Space.c文件中增加ax_kprobe()函数的声明:

extern struct net_device *ax_kprobe(int unit)


并在net/Space.c中增加:


# ifdef CONFIG_AX88796B
 {ax_kprobe, 0}
# endif



这里的范例可以参考cs89x0.c的用法,CS890X.c有cs890x_probe和cs890x_probe1两个入口。
在net/Space.c中声明:
extern struct net_device *cs89x0_probe(int unit);

然后再下面增加入口:

 197 #ifdef CONFIG_CS89x0
 198 {cs89x0_probe, 0},
 199 #endif



在这个版本的驱动中没用实现net_device_ops结构体,最好实现比较好,省的内核出现警告。
如下是DM9000的:

1173 static const struct net_device_ops dm9000_netdev_ops = {
1174 .ndo_open = dm9000_open,
1175 .ndo_stop = dm9000_stop,
1176 .ndo_start_xmit = dm9000_start_xmit,
1177 .ndo_tx_timeout = dm9000_timeout,
1178 .ndo_set_multicast_list = dm9000_hash_table,
1179 .ndo_do_ioctl = dm9000_ioctl,
1180 .ndo_change_mtu = eth_change_mtu,
1181 .ndo_validate_addr = eth_validate_addr,
1182 .ndo_set_mac_address = eth_mac_addr,
1183 #ifdef CONFIG_NET_POLL_CONTROLLER
1184 .ndo_poll_controller = dm9000_poll_controller,
1185 #endif
1186};


在probe函数中对dev的该结构体进行初始化:

ndev->netdev_ops = &dm9000_netdev_ops;


当然,net_device_ops也可以不实现,全部设置为NULL即可。


阅读(1227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~