Chinaunix首页 | 论坛 | 博客
  • 博客访问: 435514
  • 博文数量: 117
  • 博客积分: 3003
  • 博客等级: 中校
  • 技术积分: 1221
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-16 14:11
文章分类

全部博文(117)

文章存档

2011年(7)

2010年(110)

我的朋友

分类: LINUX

2010-08-19 11:00:36

intel82551系列
愚蠢呀,在一个错误的方向上浪费了太多时间.问题在linux启动以后数据包发送不到网络上,ping该网口没有输入数据包.数据包没有 发送出去,调试代码发现函数dev_hard_start_xmit函数调用的是loopback_xmit,这个明显是不对的,检查/sys /class/net/eth0目录下的operstate,发现是状态是down.设备没有起来?跟踪内核函数default_operstate中检 测netif_carrier_ok为IF_OPER_DOWN.估计在于硬件配置问题,所以内核检测MII link error,netif carrier error.需要使用ethtool调试一下.

Ethtool

ethtool在busybox没有找到对应的命令,查网上BUSYBOX的支持情况其实也没有意义,直接交叉编译一个很好用,下载最新的ethtool-6.tar.gz,用configure配置系统编译生成ethtool:
configure --target=armv5l-linux --host=armv5l-linux CC=armv5l-linux-gcc
make
将生成的ethtool命令拷贝到指定目录下:
$ethtool -t eth0
输出如下:
The test result is FAIL
The test extra info:
Link test     (on/offline)       1
Eeprom test   (on/offline)       0
Self test        (offline)       0
Mac loopback     (offline)       0
Phy loopback     (offline)       0
最终的结果还是mii_link_ok返回错误.

$ethtool -d eth0
输出如下:
SCB Status Word (Lower Word)             0x2450
RU Status:               Ready
CU Status:               Suspended
---- Interrupts Pending ----
Flow Control Pause:                no
Early Receive:                     no
Software Generated Interrupt:      yes
MDI Done:                          no
RU Not In Ready State:             no
CU Not in Active State:            yes
RU Received Frame:                 no
CU Completed Command:              no
SCB Command Word (Upper Word)            0x0000
RU Command:              No Command
CU Command:              No Command
Software Generated Interrupt:      no
---- Interrupts Masked ----
ALL Interrupts:                    no
Flow Control Pause:                no
Early Receive:                     no
RU Not In Ready State:             no
CU Not in Active State:            no
RU Received Frame:                 no
CU Completed Command:              no
MDI/MDI-X Status:                        Unknown

诊断

linux中更具revision字段决定是否需要配置microcode,如果microcode的配置不对,那么控制器就不能正常工作.这个 revision是PCI配置空间Revision ID字段,是从EEPROM中读取的,而目前EEPROM中没有这个字段.所以会配置错误.
ifconfig eth0 down
ifconfig eth0 hw ether 001122334455
ifconfig eth0 up

SHIT! RedBoot 和 Linux初始化PCI 顺序居然不一样.最奇怪的事情发生了,调试了半天第一个网口没有结果,居然实际操作的是第二个网口.要不是使用ethtool的-p命令,还真是没有想到,PCI配置的顺序不一样,中断分配错误,导致了一系列的奇怪问题,修改中断号分配代码,结果正常.

从ixdp2400的redboot工程中摘录出来的eeprom配置方案
// ------------------------------------------------------------------------
// We use this as a templete when writing a new MAC address into the
// eeproms. The MAC address in the first few bytes is over written
// with the correct MAC address and then the whole lot is programmed
// into the serial EEPROM. The checksum is calculated on the fly and
// sent instead of the last two bytes.
// The values are copied from the Intel EtherPro10/100+ &c devices
// in the EBSA boards.

#ifdef CYGPKG_DEVS_ETH_ARM_IXDP2400_WRITE_EEPROM

#define ee00 0x00, 0x00 // shorthand

static char eeprom_burn[126] = {
/* halfword addresses! */
/* 0: */ 0x00, 0x00,   0x00, 0x00,       0x00, 0x00,   0x03, 0x04,
/* 4: */     ee00   ,   0x01, 0x02,       0x01, 0x47,      ee00   ,
/* 8: */ 0x97, 0x72,   0x05, 0x57,       0x80, 0x40,   0x00, 0x00,
/* C: */ 0x00, 0x00,      ee00   ,          ee00   ,      ee00   ,
/* 10: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 14: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 18: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 1C: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 20: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 24: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 28: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 2C: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 30: */ 0x28, 0x01,      ee00   ,          ee00   ,      ee00   ,
/* 34: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 38: */     ee00   ,      ee00   ,          ee00   ,      ee00   ,
/* 3C: */     ee00   ,      ee00   ,          ee00  
};
#undef ee00


资料
Parallel系统:
PCI Master IF,MicroMachine和相关codeRom,PCI Target Control/Flash/EEprom接口,和FIFO的接口.
FIFO系统:
CSMA/CD:
PHY系统:

EEProm中的配置信息:The serial EEPROM is used to store relevant information for a LAN connection such as node address, as well as board manufacturing and configuration information.

多优先级发送队列:支持两个队列,高优先级和低优先级.

以太网概念

⑴链路层的主要功能
链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应
具备如下功能:
① 链路连接的建立,拆除,分离.
② 帧定界和帧同步.链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界.
③ 顺序控制,指对帧的收发顺序的控制.
④ 差错检测和恢复。还有链路标识,流量控制等等.差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测.各种错误的恢复则常靠反馈重发技术来完成.

⑵数据链路层的主要协议
数据链路层协议是为发对等实体间保持一致而制定的,也为了顺利完成对网络层的服务。主要协议如下:
a. ISO1745--1975:"数据通信系统的基本型控制规程".这是一种面向字符的标准,利用10 个控制字符完成链路的建立,拆除及数据交换.对帧的收发情况及差错恢复也是靠这些字符来完成.ISO1155, ISO1177, ISO2626, ISO2629等标准的配合使用可形成多种链路 控制和数据传输方式.
b. ISO3309--1984:称为"HDLC 帧结构".ISO4335--1984:称为"HDLC 规程要素 ". ISO7809--1984:称为"HDLC 规程类型汇编".这3个标准都是为面向比特的数据传输控制而制定的.有人习惯上把这3个标准组合称为高级链路控制规程.
c. ISO7776:称为"DTE数据链路层规程".与CCITT X.25LAB"平衡型链路访问规程"相兼容.
⑶链路层产品 独立的链路产品中最常见的当属网卡,网桥也是链路产品。MODEM的某些功能有人认为属于链路层,对些还有争议.
LAN(包括 Ethernet,令牌环等)已将数据链路层分割为两个子层,从而使LAN体系结构能适应多种传输媒体,换言之,在 LLC不变的条件下,只需改变MAC(媒体访问控制)便可适应不同的媒体和访问方法。

网卡的结构和传输
网卡

百兆以太网
100BaseT提供了10Mbps和100Mbps两种网络传输速度的自适应功能,网络设备之可以通过发送快速链路脉冲进行自动协商,从而实现10BaseT和100BaseT两种不同网络环境的共存和平滑过渡。构成100BaseT的主要部件包括如下几种:
网络介质:用于计算机之间的信号传递;
媒体相关接口(MDI):位于传输媒体和物理设备之间的机械和电器接口;
物理设备接口(PHY):PHY提供10/100Mbps操作,可以是一组集成电路,也可以作为外部独立设备使用,通过MII电缆也网络设备上的MII接口连接;
媒体独立接口(MII):MII可以把快速以太网设备与任何一种网络介质连接在一起,MII是一种40针接口,连接电缆的最大长度是0.5米。

千兆以太网
千兆以太网允许在两台工作站之间基于点对点链路建立流量控制机制。当一端接收信息的工作站出现网络拥塞时,可以向位于另一端的信息发送方发出一个被称为暂 停帧的特殊控制帧,指示发送方在指定的时间段内暂停发送数据。当网络恢复正常之后,接收方会向发送方发出重新传递数据的指令。

MII相关控制
MII即媒体独立接口,它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1)。数据接口包 括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII数据接口总共需要16个信号。管理接口是个双信号接口:一个是 时钟信号,另一个是数据信号。通过管理接口,上层能监视和控制PHY。

PHY整合了大量模拟硬件,而MAC是典型的全数字器件。芯片面积及模拟/数字混合架构是为什么先将MAC集成进微控制器而将PHY留在片外的原因。更灵活、密度更高的芯片技术已经可以实现MAC和PHY的单芯片整合。

如果需要,网卡通过request_firmware函数下载微码.
阅读(2347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~