static void ni52_timeout(struct net_device *dev) { struct priv *p = (struct priv *) dev->priv; #ifndef NO_NOPCOMMANDS if(p->scb->cus & CU_ACTIVE) /* COMMAND-UNIT active? */ { netif_wake_queue(dev); #ifdef DEBUG printk("%s: strange ... timeout with CU active?!?\n",dev->name); printk("%s: X0: %04x N0: %04x N1: %04x %d\n",dev->name,(int)p->xmit_cmds[0]->cmd_status,(int)p->nop_cmds[0]->cmd_status,(int)p->nop_cmds[1]->cmd_status,(int)p->nop_point); #endif p->scb->cmd_cuc = CUC_ABORT; ni_attn586(); WAIT_4_SCB_CMD(); p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]); p->scb->cmd_cuc = CUC_START; ni_attn586(); WAIT_4_SCB_CMD(); dev->trans_start = jiffies; return 0; } #endif { #ifdef DEBUG printk("%s: xmitter timed out, try to restart! stat: %02x\n",dev->name,p->scb->cus); printk("%s: command-stats: %04x %04x\n",dev->name,p->xmit_cmds[0]->cmd_status,p->xmit_cmds[1]->cmd_status); printk("%s: check, whether you set the right interrupt number!\n",dev->name); #endif ni52_close(dev); ni52_open(dev); } dev->trans_start = jiffies; }
static void ni52_timeout(struct net_device *dev) { struct priv *p = netdev_priv(dev); #ifndef NO_NOPCOMMANDS if (readb(&p->scb->cus) & CU_ACTIVE) { /* */ netif_wake_queue(dev); #ifdef DEBUG printk(KERN_ERR "%s: strange ... timeout with CU active?!?\n", dev->name); printk(KERN_ERR "%s: X0: %04x N0: %04x N1: %04x %d\n", dev->name, (int)p->xmit_cmds[0]->cmd_status, readw(&p->nop_cmds[0]->cmd_status), readw(&p->nop_cmds[1]->cmd_status), p->nop_point); #endif writeb(CUC_ABORT, &p->scb->cmd_cuc); ni_attn586(); wait_for_scb_cmd(dev); writew(make16(p->nop_cmds[p->nop_point]), &p->scb->cbl_offset); writeb(CUC_START, &p->scb->cmd_cuc); ni_attn586(); wait_for_scb_cmd(dev); dev->trans_start = jiffies; /* */ return 0; } #endif { #ifdef DEBUG printk(KERN_ERR "%s: xmitter timed out, try to restart! stat: %02x\n", dev->name, readb(&p->scb->cus)); printk(KERN_ERR "%s: command-stats: %04x %04x\n", dev->name, readw(&p->xmit_cmds[0]->cmd_status), readw(&p->xmit_cmds[1]->cmd_status)); printk(KERN_ERR "%s: check, whether you set the right interrupt number!\n", dev->name); #endif ni52_close(dev); ni52_open(dev); } dev->trans_start = jiffies; /* */ }
static int ni52_send_packet(struct sk_buff *skb, struct device *dev) { int len; #ifndef NO_NOPCOMMANDS int next_nop; #endif struct priv *p = (struct priv *) dev->priv; if(dev->tbusy) { int tickssofar = jiffies - dev->trans_start; if (tickssofar < 30) return 1; #ifdef DEBUG printk("%s: xmitter timed out, try to restart! stat: %04x\n",dev->name,p->scb->status); printk("%s: command-stats: %04x %04x\n",dev->name,p->xmit_cmds[0]->cmd_status,p->xmit_cmds[1]->cmd_status); #endif ni52_close(dev); ni52_open(dev); dev->trans_start = jiffies; } if(skb == NULL) { dev_tint(dev); return 0; } if (skb->len <= 0) return 0; if (set_bit(0, (void*)&dev->tbusy) != 0) printk("%s: Transmitter access conflict.\n", dev->name); else { memcpy((char *)p->xmit_cbuffs[p->xmit_count],(char *)(skb->data),skb->len); len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN; #ifdef ONLY_ONE_XMIT_BUF # ifdef NO_NOPCOMMANDS p->xmit_buffs[0]->size = TBD_LAST | len; p->xmit_cmds[0]->cmd_status = 0; p->scb->cbl_offset = make16(p->xmit_cmds[0]); p->scb->cmd = CUC_START; dev->trans_start = jiffies; ni_attn586(); while(p->scb->cmd) for(len=0;len<256;len++); /* DELAY(1); */ /* TEST;TEST;TEST */ # else next_nop = (p->nop_point + 1) & 0x1; p->xmit_buffs[0]->size = TBD_LAST | len; p->xmit_cmds[0]->cmd_cmd = CMD_XMIT | CMD_INT; p->xmit_cmds[0]->cmd_status = 0; p->xmit_cmds[0]->cmd_link = p->nop_cmds[next_nop]->cmd_link = make16((p->nop_cmds[next_nop])); p->nop_cmds[next_nop]->cmd_status = 0; p->nop_cmds[p->nop_point]->cmd_link = make16((p->xmit_cmds[0])); dev->trans_start = jiffies; p->nop_point = next_nop; # endif #else p->xmit_buffs[p->xmit_count]->size = TBD_LAST | len; if( (next_nop = p->xmit_count + 1) == NUM_XMIT_BUFFS ) next_nop = 0; p->xmit_cmds[p->xmit_count]->cmd_cmd = CMD_XMIT | CMD_INT; p->xmit_cmds[p->xmit_count]->cmd_status = 0; p->xmit_cmds[p->xmit_count]->cmd_link = p->nop_cmds[next_nop]->cmd_link = make16((p->nop_cmds[next_nop])); p->nop_cmds[next_nop]->cmd_status = 0; p->nop_cmds[p->xmit_count]->cmd_link = make16((p->xmit_cmds[p->xmit_count])); dev->trans_start = jiffies; p->xmit_count = next_nop; cli(); if(p->xmit_count != p->xmit_last) dev->tbusy = 0; sti(); #endif } dev_kfree_skb(skb,FREE_WRITE); return 0; }
static int ni52_send_packet(struct sk_buff *skb, struct device *dev) { int len,i; #ifndef NO_NOPCOMMANDS int next_nop; #endif struct priv *p = (struct priv *) dev->priv; if(dev->tbusy) { int tickssofar = jiffies - dev->trans_start; if (tickssofar < 5) return 1; if(p->scb->status & CU_ACTIVE) /* COMMAND-UNIT active? */ { dev->tbusy = 0; #ifdef DEBUG printk("%s: strange ... timeout with CU active?!?\n",dev->name); printk("%s: X0: %04x N0: %04x N1: %04x %d\n",dev->name,(int)p->xmit_cmds[0]->cmd_status,(int)p->nop_cmds[0]->cmd_status,(int)p->nop_cmds[1]->cmd_status,(int)p->nop_point); #endif p->scb->cmd = CUC_ABORT; ni_attn586(); WAIT_4_SCB_CMD(); p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]); p->scb->cmd = CUC_START; ni_attn586(); WAIT_4_SCB_CMD(); dev->trans_start = jiffies; return 0; } else { #ifdef DEBUG printk("%s: xmitter timed out, try to restart! stat: %04x\n",dev->name,p->scb->status); printk("%s: command-stats: %04x %04x\n",dev->name,p->xmit_cmds[0]->cmd_status,p->xmit_cmds[1]->cmd_status); #endif ni52_close(dev); ni52_open(dev); } dev->trans_start = jiffies; return 0; } if(skb == NULL) { dev_tint(dev); return 0; } if (skb->len <= 0) return 0; if(skb->len > XMIT_BUFF_SIZE) { printk("%s: Sorry, max. framelength is %d bytes. The length of your frame is %ld bytes.\n",dev->name,XMIT_BUFF_SIZE,skb->len); return 0; } if (set_bit(0, (void*)&dev->tbusy) != 0) printk("%s: Transmitter access conflict.\n", dev->name); else { memcpy((char *)p->xmit_cbuffs[p->xmit_count],(char *)(skb->data),skb->len); len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN; #if (NUM_XMIT_BUFFS == 1) # ifdef NO_NOPCOMMANDS p->xmit_buffs[0]->size = TBD_LAST | len; for(i=0;i<16;i++) { p->scb->cbl_offset = make16(p->xmit_cmds[0]); p->scb->cmd = CUC_START; p->xmit_cmds[0]->cmd_status = 0; ni_attn586(); dev->trans_start = jiffies; if(!i) dev_kfree_skb(skb,FREE_WRITE); WAIT_4_SCB_CMD(); if( (p->scb->status & CU_ACTIVE)) /* test it, because CU sometimes doesn't start immediately */ break; if(p->xmit_cmds[0]->cmd_status) break; if(i==15) printk("%s: Can't start transmit-command.\n",dev->name); } # else next_nop = (p->nop_point + 1) & 0x1; p->xmit_buffs[0]->size = TBD_LAST | len; p->xmit_cmds[0]->cmd_link = p->nop_cmds[next_nop]->cmd_link = make16((p->nop_cmds[next_nop])); p->xmit_cmds[0]->cmd_status = p->nop_cmds[next_nop]->cmd_status = 0; p->nop_cmds[p->nop_point]->cmd_link = make16((p->xmit_cmds[0])); dev->trans_start = jiffies; p->nop_point = next_nop; dev_kfree_skb(skb,FREE_WRITE); # endif #else p->xmit_buffs[p->xmit_count]->size = TBD_LAST | len; if( (next_nop = p->xmit_count + 1) == NUM_XMIT_BUFFS ) next_nop = 0; p->xmit_cmds[p->xmit_count]->cmd_status = 0; p->xmit_cmds[p->xmit_count]->cmd_link = p->nop_cmds[next_nop]->cmd_link = make16((p->nop_cmds[next_nop])); p->nop_cmds[next_nop]->cmd_status = 0; p->nop_cmds[p->xmit_count]->cmd_link = make16((p->xmit_cmds[p->xmit_count])); dev->trans_start = jiffies; p->xmit_count = next_nop; cli(); if(p->xmit_count != p->xmit_last) dev->tbusy = 0; sti(); dev_kfree_skb(skb,FREE_WRITE); #endif } return 0; }