📄 00000004.htm
字号:
unsigned long base_addr; /* device I/O address */ <BR> unsigned char irq; /* device IRQ number */ <BR> <BR> /* Low-level status flags. */ <BR> volatile unsigned char start, /* start an operation */ <BR> interrupt; /* interrupt arrived */ <BR> /* 在处理中断时interrupt设为1,处理完清0。 */ <BR> unsigned long tbusy; /* transmitter busy must be long for <BR>bitops */ <BR> <BR> struct device *next; <BR> <BR> /* The device initialization function. Called only once. */ <BR> /* 指向驱动程序的初始化方法。 */ <BR> int (*init)(struct device *dev); <BR> <BR> /* Some hardware also needs these fields, but they are not part of the <BR> usual set specified in Space.c. */ <BR> /* 一些硬件可以在一块板上支持多个接口,可能用到if_port。 */ <BR> unsigned char if_port; /* Selectable AUI, TP,..*/ <BR> unsigned char dma; /* DMA channel */ <BR> <BR> struct enet_statistics* (*get_stats)(struct device *dev); <BR> <BR> /* <BR> * This marks the end of the "visible" part of the structure. All <BR> * fields hereafter are internal to the system, and may change at <BR> * will (read: may be cleaned up at will). <BR> */ <BR> <BR> /* These may be needed for future network-power-down code. */ <BR> /* trans_start记录最后一次成功发送的时间。可以用来确定硬件是否工作正常。*/ <BR> unsigned long trans_start; /* Time (in jiffies) of last Tx */ <BR> unsigned long last_rx; /* Time of last Rx */ <BR> <BR> /* flags里面有很多内容,定义在include/linux/if.h里。*/ <BR> unsigned short flags; /* interface flags (a la BSD) */ <BR> unsigned short family; /* address family ID (AF_INET) */ <BR> unsigned short metric; /* routing metric (not used) */ <BR> unsigned short mtu; /* interface MTU value */ <BR> <BR> /* type标明物理硬件的类型。主要说明硬件是否需要arp。定义在 <BR> include/linux/if_arp.h里。 */ <BR> unsigned short type; /* interface hardware type */ <BR> <BR> /* 上层协议层根据hard_header_len在发送数据缓冲区前面预留硬件帧头空间。*/ <BR> unsigned short hard_header_len; /* hardware hdr length */ <BR> <BR> /* priv指向驱动程序自己定义的一些参数。*/ <BR> void *priv; /* pointer to private data */ <BR> <BR> /* Interface address info. */ <BR> unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ <BR> unsigned char pad; /* make dev_addr aligned to 8 <BR>bytes */ <BR> unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address */ <BR> unsigned char addr_len; /* hardware address length */ <BR> unsigned long pa_addr; /* protocol address */ <BR> unsigned long pa_brdaddr; /* protocol broadcast addr */ <BR> unsigned long pa_dstaddr; /* protocol P-P other side addr */ <BR> unsigned long pa_mask; /* protocol netmask */ <BR> unsigned short pa_alen; /* protocol address length */ <BR> <BR> struct dev_mc_list *mc_list; /* Multicast mac addresses */ <BR> int mc_count; /* Number of installed mcasts */ <BR> <BR> struct ip_mc_list *ip_mc_list; /* IP multicast filter chain */ <BR> __u32 tx_queue_len; /* Max frames per queue allowed */ <BR> <BR> <BR>------------------ Linux操作系统网络驱动程序编写 ------------------- <BR>------------ Contact the author by <A HREF="mailto:mailto:bordi@bordi.dhs.org">mailto:bordi@bordi.dhs.org</A> ------ <BR> <BR> /* For load balancing driver pair support */ <BR> <BR> unsigned long pkt_queue; /* Packets queued */ <BR> struct device *slave; /* Slave device */ <BR> struct net_alias_info *alias_info; /* main dev alias info */ <BR> struct net_alias *my_alias; /* alias devs */ <BR> <BR> /* Pointer to the interface buffers. */ <BR> struct sk_buff_head buffs[DEV_NUMBUFFS]; <BR> <BR> /* Pointers to interface service routines. */ <BR> int (*open)(struct device *dev); <BR> int (*stop)(struct device *dev); <BR> int (*hard_start_xmit) (struct sk_buff *skb, <BR> struct device *dev); <BR> int (*hard_header) (struct sk_buff *skb, <BR> struct device *dev, <BR> unsigned short type, <BR> void *daddr, <BR> void *saddr, <BR> unsigned len); <BR> int (*rebuild_header)(void *eth, struct device *dev, <BR> unsigned long raddr, struct sk_buff *skb); <BR>#define HAVE_MULTICAST <BR> void (*set_multicast_list)(struct device *dev); <BR>#define HAVE_SET_MAC_ADDR <BR> int (*set_mac_address)(struct device *dev, void *addr); <BR>#define HAVE_PRIVATE_IOCTL <BR> int (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd); <BR>#define HAVE_SET_CONFIG <BR> int (*set_config)(struct device *dev, struct ifmap *map); <BR>#define HAVE_HEADER_CACHE <BR> void (*header_cache_bind)(struct hh_cache **hhp, struct device <BR>*dev, unsigned short htype, __u32 daddr); <BR> void (*header_cache_update)(struct hh_cache *hh, struct device <BR>*dev, unsigned char * haddr); <BR>#define HAVE_CHANGE_MTU <BR> int (*change_mtu)(struct device *dev, int new_mtu); <BR> <BR> struct iw_statistics* (*get_wireless_stats)(struct device *dev); <BR>}; <BR> <BR> <BR>2.4 常用的系统支持 <BR> <BR>2.4.1 内存申请和释放 <BR> include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申 <BR>请和释放内存。 <BR> void *kmalloc(unsigned int len,int priority); <BR> void kfree(void *__ptr); <BR> 与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的整 <BR>次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数,通常使用 <BR>时可以为GFP_KERNEL,如果在中断里调用用GFP_ATOMIC参数,因为使用GFP_KERNEL <BR>则调用者可能进入sleep状态,在处理中断时是不允许的。 <BR> kfree()释放的内存必须是kmalloc()申请的。如果知道内存的大小,也可以用 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -