📄 linux下dm9000网卡驱动实验〈二〉 - orange - csdnblog.htm
字号:
<P>
<TABLE class=MsoNormalTable
style="BACKGROUND: #e6e6e6; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt"
cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR
style="HEIGHT: 350.4pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD
style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; BORDER-BOTTOM-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 426.1pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; HEIGHT: 350.4pt; BACKGROUND-COLOR: transparent; BORDER-RIGHT-COLOR: #ece9d8"
vAlign=top width=568>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">struct
net_device</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">{</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>char<SPAN
style="mso-tab-count: 4">
</SPAN>name[IFNAMSIZ];</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned
short<SPAN style="mso-tab-count: 1">
</SPAN>flags;<SPAN style="mso-tab-count: 1"> </SPAN>/*
interface flags (a <PERSONNAME productid="la BSD"
w:st="on"></PERSONNAME>la BSD)<SPAN
style="mso-tab-count: 1"> </SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned
long<SPAN style="mso-tab-count: 2">
</SPAN>base_addr;<SPAN style="mso-tab-count: 1">
</SPAN>/* device I/O address<SPAN style="mso-tab-count: 1">
</SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned int<SPAN
style="mso-tab-count: 2">
</SPAN>irq;<SPAN style="mso-tab-count: 2">
</SPAN>/* device IRQ number<SPAN style="mso-tab-count: 1">
</SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned
char<SPAN style="mso-tab-count: 2">
</SPAN>dev_addr[MAX_ADDR_LEN];<SPAN style="mso-tab-count: 1"> </SPAN>/* hw
address<SPAN style="mso-tab-count: 1"> </SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned
char<SPAN style="mso-tab-count: 2">
</SPAN>addr_len;<SPAN style="mso-tab-count: 1"> </SPAN>/* hardware address
length<SPAN style="mso-tab-count: 1"> </SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned
long<SPAN style="mso-tab-count: 2">
</SPAN>trans_start;<SPAN style="mso-tab-count: 1"> </SPAN>/* Time
(in jiffies) of last Tx<SPAN style="mso-tab-count: 1">
</SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>unsigned
long<SPAN style="mso-tab-count: 2">
</SPAN>last_rx;<SPAN style="mso-tab-count: 1"> </SPAN>/* Time of last
Rx<SPAN style="mso-tab-count: 1"> </SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 4">
</SPAN>watchdog_timeo;</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>void<SPAN
style="mso-tab-count: 4">
</SPAN>*priv;<SPAN style="mso-tab-count: 1"> </SPAN>/* pointer
to private data<SPAN style="mso-tab-count: 1"> </SPAN>*/</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>struct
module<SPAN style="mso-tab-count: 2">
</SPAN>*owner;<SPAN style="mso-tab-count: 1"> </SPAN>/* open/release
and usage marking */</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"></SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 5">
</SPAN>(*init)(struct net_device *dev);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 5">
</SPAN>(*open)(struct net_device *dev);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 5">
</SPAN>(*stop)(struct net_device *dev);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 5">
</SPAN>(*set_config)(struct net_device *dev, struct ifmap
*map);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 5">
</SPAN>(*hard_start_xmit) (struct sk_buff *skb,struct net_device
*dev);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1"> </SPAN>int<SPAN
style="mso-tab-count: 5">
</SPAN>(*set_mac_address)(struct net_device *dev,<SPAN
style="mso-spacerun: yes"> </SPAN>void *addr);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"><SPAN
style="mso-tab-count: 1">
</SPAN>//..............</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">};</SPAN></P>
<P> </P>
<P> </P></TD></TR></TBODY></TABLE></P>
<P class=MsoToc1 style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 黑体; mso-ascii-font-family: " times="" new=""><FONT
size=3>网卡实现的抽象接口</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT
size=3><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">init(),open(),stop(),set_config()</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">方法在模板中已经清楚地介绍了,这里重点讲解<SPAN
lang=EN-US>hard_start_xmit()</SPAN>方法。当内核需要发送一个数据包时,他调用<SPAN
lang=EN-US>hard_start_xmit()</SPAN>方法将数据放到一个输出队列。数据包包含在一个套接字缓冲区结构体(<SPAN
lang=EN-US>struct sk_buff</SPAN>)变量中。对于驱动程序来说,<SPAN
lang=EN-US>sk_buff</SPAN>只是一个数据包,不用关心里面复杂的结构成员。<SPAN
lang=EN-US></SPAN></SPAN></FONT></P>
<P> </P>
<P class=MsoCaption style="MARGIN: 7.6pt 0cm 8pt"><SPAN
style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">程序清单</SPAN><FONT
face=Arial> <SPAN lang=EN-US><SPAN style="mso-field-code: " styleref=""><SPAN
style="mso-no-proof: yes">0</SPAN></SPAN>‑<SPAN style="mso-field-code: " 程序清单=""
seq="" arabic=""><SPAN style="mso-no-proof: yes">3</SPAN></SPAN></SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-fareast-font-family: 黑体; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"></SPAN></FONT></P>
<P>
<TABLE class=MsoNormalTable
style="BACKGROUND: #e6e6e6; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt"
cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD
style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; BORDER-BOTTOM-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 426.1pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent; BORDER-RIGHT-COLOR: #ece9d8"
vAlign=top width=568>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">static
int test_tx(struct sk_buff * skb , struct net_device * dev)</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">{</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">int
len;</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"></SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">netif_stop_queue(dev);<SPAN
style="mso-spacerun: yes"> </SPAN>//</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">让内核暂停调用<SPAN
lang=EN-US>hard_start_xmit()</SPAN>方法<SPAN lang=EN-US></SPAN></SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">len =
skb->len < ETH_ZLEN ? ETH_ZLEN :skb->len;</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">//</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">把<SPAN
lang=EN-US>len</SPAN>个数据写入网络设备硬件缓冲区并启动发送;<SPAN
lang=EN-US></SPAN></SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">dev->trans_start
= jiffies;</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold"> <SPAN
lang=EN-US>//</SPAN>记录时间<SPAN lang=EN-US></SPAN></SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">dev_kfree_skb(skb);</SPAN></P>
<P> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">//</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-weight: bold">等待数据发送完毕<SPAN
lang=EN-US></SPAN></SPAN></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -