1146 iow(db, DM9KS_IMR, DM9KS_REGFF);
1147 }
1148 /* Set timer again */
1149 db->timer.expires = DMFE_TIMER_WUT;
1150 add_timer(&db->timer);
1151
1152 return;
1153 }
1154
1155
1156 /*
1157 Received a packet and pass to upper layer
1158 */
1159 static void dmfe_packet_receive(struct net_device *dev)
1160 {
1161 board_info_t *db = (board_info_t *)dev->priv;
1162 struct sk_buff *skb;
1163 u8 rxbyte;
1164 u16 i, GoodPacket, tmplen = 0, MDRAH, MDRAL;
1165 u32 tmpdata;
1166
1167 rx_t rx;
1168
1169 u16 * ptr = (u16*)℞
1170 u8* rdptr;
1171
1172 DMFE_DBUG(0, 'dmfe_packet_receive()', 0);
1173
1174 db->cont_rx_pkt_cnt=0;
1175
1176 do {
1177 /*store the value of Memory Data Read address register*/
1178 MDRAH=ior(db, DM9KS_MDRAH);
1179 MDRAL=ior(db, DM9KS_MDRAL);
1180
1181 ior(db, DM9KS_MRCMDX); /* Dummy read */
1182 rxbyte = inb(db->io_data); /* Got most updated data */
1183
1184 #ifdef CHECKSUM
1185 if (rxbyte&0x2) /* check RX byte */
1186 {
1187 printk('dm9ks: abnormal!n');
1188 dmfe_reset(dev);
1189 break;
1190 }else {
1191 if (!(rxbyte&0x1))
1192 break;
1193 }
1194 #else
1195 if (rxbyte==0)
1196 break;
1197
1198 if (rxbyte>1)
1199 {
1200 printk('dm9ks: Rxbyte error!n');
1201 dmfe_reset(dev);
1202 break;
1203 }
1204 #endif
1205
1206 /* A packet ready now & Get status/length */
1207 GoodPacket = TRUE;
1208 outb(DM9KS_MRCMD, db->io_addr);
1209
1210 /* Read packet status & length */
1211 switch (db->io_mode)
1212 {
1213 case DM9KS_BYTE_MODE:
1214 *ptr = inb(db->io_data) +
1215 (inb(db->io_data) << 8);
1216 *(ptr+1) = inb(db->io_data) +
1217 (inb(db->io_data) << 8);
1218 break;
1219 case DM9KS_WORD_MODE:
1220 *ptr = inw(db->io_data);
1221 *(ptr+1) = inw(db->io_data);
1222 break;
1223 case DM9KS_DWORD_MODE:
1224 tmpdata = inl(db->io_data);
1225 *ptr = tmpdata;
1226 *(ptr+1) = tmpdata >> 16;
1227 break;
1228 default:
1229 break;
1230 }
1231
1232 /* Packet status check */
1233 if (rx.desc.status & 0xbf)
1234 {
1235 GoodPacket = FALSE;
1236 if (rx.desc.status & 0x01)
1237 {
1238 db->stats.rx_fifo_errors++;
1239 printk(KERN_INFO' 1240 } 1241 if (rx.desc.status & 0x02) 1242 { 1243 db->stats.rx_crc_errors++; 1244 printk(KERN_INFO' 1245 } 1246 if (rx.desc.status & 0x80) 1247 { 1248 db->stats.rx_length_errors++; 1249 printk(KERN_INFO' 1250 } 1251 if (rx.desc.status & 0x08) 1252 printk(KERN_INFO' 1253 } 1254 1255 if (!GoodPacket) 1256 { 1257 // drop this packet!!! 1258 switch (db->io_mode) 1259 { 1260 case DM9KS_BYTE_MODE: 1261 for (i=0; i 1263 break; 1264 case DM9KS_WORD_MODE: 1265 tmplen = (rx.desc.length + 1) / 2; 1266 for (i = 0; i < tmplen; i++) 1267 inw(db->io_data); 1268 break; 1269 case DM9KS_DWORD_MODE: 1270 tmplen = (rx.desc.length + 3) / 4; 1271 for (i = 0; i < tmplen; i++) 1272 inl(db->io_data); 1273 break; 1274 } 1275 continue;/*next the packet*/ 1276 } 1277 1278 skb = dev_alloc_skb(rx.desc.length+4); 1279 if (skb == NULL ) 1280 { 1281 printk(KERN_INFO '%s: Memory squeeze.n', dev->name); 1282 /*re-load the value into Memory data read address register*/ 1283 iow(db,DM9KS_MDRAH,MDRAH); 1284 iow(db,DM9KS_MDRAL,MDRAL); 1285 return; 1286 } 1287 else 1288 { 1289 /* Move data from DM9000 */ 1290 skb->dev = dev; 1291 skb_reserve(skb, 2); 1292 rdptr = (u8*)skb_put(skb, rx.desc.length - 4); 1293 1294 /* Read received packet from RX SARM */ 1295 switch (db->io_mode) 1296 { 1297 case DM9KS_BYTE_MODE: 1298 for (i=0; i
上一篇:s3c2440的USB热插拔驱动问题
下一篇:S3C实现DMA驱动程序编写
推荐阅读最新更新时间:2024-11-13 23:25
设计资源 培训 开发板 精华推荐
- 用于汽车应用的 LTC3632EDD 5V、20mA 稳压器的典型应用电路
- LM337T 双跟踪电源 ±1.25V 至 ±20V 的典型应用
- LM2902DTBG 多反馈带通滤波器运算放大器的典型应用
- 使用具有 B 类 EMI 滤波(单输出)的 RP10-1215DA DC/DC 转换器的典型应用
- 具有外部基准电压源和 I/V 转换器的单电源 2.5V 双向工作应用电路
- 支持WindowsHello的摄像头模组转接板
- 自制ESP8266小电视
- ADP1850 宽范围输入、双相/两相、DC 至 DC 同步降压控制器的典型应用单相电路
- STM32L152RC MCU探索套件
- 新国标五孔计量插座10A