/* * DUMP .. we expect a not running CMD unit and enough space */ void sun3_82586_dump(struct net_device *dev,void *ptr) { struct priv *p = (struct priv *) dev->priv; struct dump_cmd_struct *dump_cmd = (struct dump_cmd_struct *) ptr; int i; p->scb->cmd_cuc = CUC_ABORT; sun3_attn586(); WAIT_4_SCB_CMD(); WAIT_4_SCB_CMD_RUC(); dump_cmd->cmd_status = 0; dump_cmd->cmd_cmd = CMD_DUMP | CMD_LAST; dump_cmd->dump_offset = make16((dump_cmd + 1)); dump_cmd->cmd_link = 0xffff; p->scb->cbl_offset = make16(dump_cmd); p->scb->cmd_cuc = CUC_START; sun3_attn586(); WAIT_4_STAT_COMPL(dump_cmd); if( (dump_cmd->cmd_status & (STAT_COMPL|STAT_OK)) != (STAT_COMPL|STAT_OK) ) printk("%s: Can't get dump information.\n",dev->name); for(i=0; i<170; i++) { printk("%02x ",(int) ((unsigned char *) (dump_cmd + 1))[i]); if(i % 24 == 23) printk("\n"); } printk("\n"); }
void read_dht22 (float &dhthum, float &dthtemp, int1 &minus) { byte i, dht22_checksum; int16 temperature, humidity; float temp, hum; dht_init(); CheckRe(); if(check == 1) { for (i=0; i<5; i++) { dht22_dat[i] = read_data_dht(); } } dht22_checksum = dht22_dat[0]+dht22_dat[1]+dht22_dat[2]+dht22_dat[3]; if(dht22_dat[4] != dht22_checksum) { printf("DHT checksum error"); } humidity = make16(dht22_dat[0], dht22_dat[1]); temperature = make16(dht22_dat[2], dht22_dat[3]); if(temperature > 0x8000) { temperature = temperature & 0x7FFF; minus = 1; } hum = humidity; temp = temperature; dhthum = (hum)/10; dthtemp = (temp)/10; }
static void set_multicast_list(struct device *dev, int num_addrs, void *addrs) { /* struct priv *p = (struct priv *) dev->priv; volatile struct configure_cmd_struct *cfg_cmd; */ if(!num_addrs) printk("%s: Currently, the Ni52 driver doesn't support promiscuous or multicast mode.\n",dev->name); #if 0 p->scb->cmd = CUC_SUSPEND; ni_attn586(); while(p->scb->cmd); p->scb->cmd = RUC_SUSPEND; ni_attn586(); while(p->scb->cmd); cfg_cmd = (struct configure_cmd_struct *) p->xmit_cbuffs[0]; /* we're using a transmitcommand */ cfg_cmd->cmd_status = 0; cfg_cmd->cmd_cmd = CMD_CONFIGURE | CMD_LAST; cfg_cmd->cmd_link = 0xffff; cfg_cmd->byte_cnt = 0x0a; /* number of cfg bytes */ cfg_cmd->fifo = 0x08; /* fifo-limit (8=tx:32/rx:64) */ cfg_cmd->sav_bf = 0x40; /* hold or discard bad recv frames (bit 7) */ cfg_cmd->adr_len = 0x2e; /* addr_len |!src_insert |pre-len |loopback */ cfg_cmd->priority = 0x00; cfg_cmd->ifd = 0x60; cfg_cmd->time_low = 0x00; cfg_cmd->time_high = 0xf2; cfg_cmd->promisc = 0x01; /* promisc on */ cfg_cmd->carr_coll = 0x00; p->scb->cbl_offset = make16(cfg_cmd); p->scb->cmd = CUC_START; /* cmd.-unit start */ ni_attn586(); while(p->scb->cmd); p->scb->cbl_offset = p->nop_cmds[0]->cmd_link = make16(p->nop_cmds[0]); p->scb->cmd = CUC_START; ni_atthn586(); while(p->scb->cmd); p->scb->cmd = RUC_RESUME; ni_atthn586(); while(p->scb->cmd); #endif }
static void elmc_timeout(struct net_device *dev) { struct priv *p = (struct priv *) dev->priv; /* COMMAND-UNIT active? */ if (p->scb->status & CU_ACTIVE) { #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; elmc_attn586(); WAIT_4_SCB_CMD(); p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]); p->scb->cmd = CUC_START; elmc_attn586(); WAIT_4_SCB_CMD(); netif_wake_queue(dev); } 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 elmc_close(dev); elmc_open(dev); } }
static void sun3_82586_timeout(struct net_device *dev) { struct priv *p = netdev_priv(dev); #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)swab16(p->xmit_cmds[0]->cmd_status),(int)swab16(p->nop_cmds[0]->cmd_status),(int)swab16(p->nop_cmds[1]->cmd_status),(int)p->nop_point); #endif p->scb->cmd_cuc = CUC_ABORT; sun3_attn586(); WAIT_4_SCB_CMD(); p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]); p->scb->cmd_cuc = CUC_START; sun3_attn586(); WAIT_4_SCB_CMD(); dev->trans_start = jiffies; /* prevent tx timeout */ 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,swab16(p->xmit_cmds[0]->cmd_status),swab16(p->xmit_cmds[1]->cmd_status)); printk("%s: check, whether you set the right interrupt number!\n",dev->name); #endif sun3_82586_close(dev); sun3_82586_open(dev); } dev->trans_start = jiffies; /* prevent tx timeout */ }
void alloc586(struct net_device *dev) { struct priv *p = (struct priv *) dev->priv; elmc_id_reset586(); DELAY(2); p->scp = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS); p->scb = (struct scb_struct *) bus_to_virt(dev->mem_start); p->iscp = (struct iscp_struct *) ((char *) p->scp - sizeof(struct iscp_struct)); memset((char *) p->iscp, 0, sizeof(struct iscp_struct)); memset((char *) p->scp, 0, sizeof(struct scp_struct)); p->scp->iscp = make24(p->iscp); p->scp->sysbus = SYSBUSVAL; p->iscp->scb_offset = make16(p->scb); p->iscp->busy = 1; elmc_id_reset586(); elmc_id_attn586(); DELAY(2); if (p->iscp->busy) { printk(KERN_ERR "%s: Init-Problems (alloc).\n", dev->name); } memset((char *) p->scb, 0, sizeof(struct scb_struct)); }
/****************************************************************** * set iscp at the right place, called by sun3_82586_probe1 and open586. */ static void alloc586(struct net_device *dev) { struct priv *p = netdev_priv(dev); sun3_reset586(); DELAY(1); p->scp = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS); p->iscp = (struct iscp_struct *) dvma_btov(dev->mem_start); p->scb = (struct scb_struct *) ((char *)p->iscp + sizeof(struct iscp_struct)); memset((char *) p->iscp,0,sizeof(struct iscp_struct)); memset((char *) p->scp ,0,sizeof(struct scp_struct)); p->scp->iscp = make24(p->iscp); p->scp->sysbus = SYSBUSVAL; p->iscp->scb_offset = make16(p->scb); p->iscp->scb_base = make24(dvma_btov(dev->mem_start)); p->iscp->busy = 1; sun3_reset586(); sun3_attn586(); DELAY(1); if(p->iscp->busy) printk("%s: Init-Problems (alloc).\n",dev->name); p->reseted = 0; memset((char *)p->scb,0,sizeof(struct scb_struct)); }
int16 rtc_read_int16(int8 addr) { int8 a,b; a=read_rtc(addr+0); b=read_rtc(addr+1); return make16(a,b); }
void alloc586(struct device *dev) { struct priv *p = (struct priv *) dev->priv; p->scp = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS); p->scb = (struct scb_struct *) (dev->mem_start); p->iscp = (struct iscp_struct *) ((char *)p->scp - sizeof(struct iscp_struct)); memset((char *) p->iscp,0,sizeof(struct iscp_struct)); memset((char *) p->scp ,0,sizeof(struct scp_struct)); p->scp->iscp = make24(p->iscp); p->scp->sysbus = SYSBUSVAL; p->iscp->scb_offset = make16(p->scb); p->iscp->busy = 1; ni_reset586(); ni_attn586(); #ifdef DEBUG DELAY(2); if(p->iscp->busy) printk("%s: Init-Problems (alloc).\n",dev->name); #endif memset((char *)p->scb,0,sizeof(struct scb_struct)); }
static void alloc586(struct net_device *dev) { struct priv *p = netdev_priv(dev); ni_reset586(); mdelay(32); memset_io(p->iscp, 0, sizeof(struct iscp_struct)); memset_io(p->scp , 0, sizeof(struct scp_struct)); writel(make24(p->iscp), &p->scp->iscp); writeb(SYSBUSVAL, &p->scp->sysbus); writew(make16(p->scb), &p->iscp->scb_offset); writeb(1, &p->iscp->busy); ni_reset586(); ni_attn586(); mdelay(32); if (readb(&p->iscp->busy)) printk(KERN_ERR "%s: Init-Problems (alloc).\n", dev->name); p->reset = 0; memset_io(p->scb, 0, sizeof(struct scb_struct)); }
// Mpu6050 xuat ra gia tri 16bit signed int16 GetdataMpu6050(unsigned int8 RegAddr) { unsigned int8 LSB; unsigned int8 MSB; MSB=ReadMpu6050(RegAddr); LSB=ReadMpu6050(RegAddr+1); return (make16(MSB,LSB)); }
static void startrecv586(struct net_device *dev) { struct priv *p = (struct priv *) dev->priv; p->scb->rfa_offset = make16(p->rfd_first); p->scb->cmd = RUC_START; elmc_attn586(); /* start cmd. */ WAIT_4_SCB_CMD(); /* wait for accept cmd. (no timeout!!) */ }
static void *alloc_rfa(struct device *dev,void *ptr) { volatile struct rfd_struct *rfd = (struct rfd_struct *)ptr; volatile struct rbd_struct *rbd; int i; struct priv *p = (struct priv *) dev->priv; memset((char *) rfd,0,sizeof(struct rfd_struct)*NUM_RECV_FRAMES); p->rfd_first = rfd; for(i = 0; i < NUM_RECV_FRAMES; i++) rfd[i].next = make16(rfd + (i+1) % NUM_RECV_FRAMES); rfd[NUM_RECV_FRAMES-1].last = RFD_LAST; /* set EOL (no RU suspend) */ ptr = (char *) (rfd + NUM_RECV_FRAMES); rbd = (struct rbd_struct *) ptr; ptr += sizeof(struct rbd_struct)*NUM_RECV_BUFFS; /* clr descriptors */ memset((char *) rbd,0,sizeof(struct rbd_struct)*NUM_RECV_BUFFS); p->min_cbuff32 = ptr; for(i=0;i<NUM_RECV_BUFFS;i++) { rbd[i].next = make16((rbd + (i+1) % NUM_RECV_BUFFS)); rbd[i].size = RECV_BUFF_SIZE; rbd[i].buffer = make24(ptr); ptr += RECV_BUFF_SIZE; } rbd[NUM_RECV_BUFFS-1].size |= RBD_LAST; /* set eol */ p->max_cbuff32 = ptr; p->max_cbuff24 = make24(p->max_cbuff32); p->rfd_top = p->rfd_first; p->rfd_last = p->rfd_first + NUM_RECV_FRAMES - 1; p->rbd_last = rbd + NUM_RECV_BUFFS - 1; p->scb->rfa_offset = make16(p->rfd_first); p->rfd_first->rbd_offset = make16(rbd); return ptr; }
int mmcsd_init_seq(int *r7) { int r, i; mmcsd_deselect(); for (i = 0; i < 10; ++i) spi_read(DUMMY_BYTE); delay_ms(10); mmcsd_select(); r = 0; r = mmcsd_go_idle_state(TRUE); mmcsd_deselect(); if (r != 0x01) return 0xFF; i = 0; do { delay_ms(10); mmcsd_select(); r = 0; r = mmcsd_sd_send_cmd(SEND_IF_COND, IF_CONDITION_PASS, TRUE, r7); mmcsd_deselect(); i++; if (i == 0xFF) return RESP_TIMEOUT; } while (make16(r7[1], r7[0]) != IF_CONDITION_PASS); i = 0; do { delay_ms(10); mmcsd_select(); r = 0; r = mmcsd_app_send_op_cond(OP_CONDITION, TRUE); mmcsd_deselect(); i++; if (i == 0xFF) return RESP_TIMEOUT; } while (r != 0); i = 0; do { delay_ms(10); mmcsd_select(); mmcsd_send_cmd(CRC_ON_OFF, 0, TRUE); r = 0xFF; r = mmcsd_get_r7(r7); mmcsd_deselect(); i++; if (i == 0xFF) return RESP_TIMEOUT; } while (bit_test(r, 0)); return r; }
static void startrecv586(struct net_device *dev) { struct priv *p = netdev_priv(dev); WAIT_4_SCB_CMD(); WAIT_4_SCB_CMD_RUC(); p->scb->rfa_offset = make16(p->rfd_first); p->scb->cmd_ruc = RUC_START; sun3_attn586(); /* start cmd. */ WAIT_4_SCB_CMD_RUC(); /* wait for accept cmd. (no timeout!!) */ }
static void __iomem *alloc_rfa(struct net_device *dev, void __iomem *ptr) { struct rfd_struct __iomem *rfd = ptr; struct rbd_struct __iomem *rbd; int i; struct priv *p = netdev_priv(dev); memset_io(rfd, 0, sizeof(struct rfd_struct) * (p->num_recv_buffs + rfdadd)); p->rfd_first = rfd; for (i = 0; i < (p->num_recv_buffs + rfdadd); i++) { writew(make16(rfd + (i+1) % (p->num_recv_buffs+rfdadd)), &rfd[i].next); writew(0xffff, &rfd[i].rbd_offset); } /* */ writeb(RFD_SUSP, &rfd[p->num_recv_buffs-1+rfdadd].last); ptr = rfd + (p->num_recv_buffs + rfdadd); rbd = ptr; ptr = rbd + p->num_recv_buffs; /* */ memset_io(rbd, 0, sizeof(struct rbd_struct) * (p->num_recv_buffs)); for (i = 0; i < p->num_recv_buffs; i++) { writew(make16(rbd + (i+1) % p->num_recv_buffs), &rbd[i].next); writew(RECV_BUFF_SIZE, &rbd[i].size); writel(make24(ptr), &rbd[i].buffer); ptr = ptr + RECV_BUFF_SIZE; } p->rfd_top = p->rfd_first; p->rfd_last = p->rfd_first + (p->num_recv_buffs - 1 + rfdadd); writew(make16(p->rfd_first), &p->scb->rfa_offset); writew(make16(rbd), &p->rfd_first->rbd_offset); return ptr; }
void read_temp(){ onewire_init(); onewire_sendbyte(0xCC); //Transmit skip Rom Command onewire_sendbyte(0x69); //0x69 Transmit Read RAM command onewire_sendbyte(0x18); //Transmit Read start address data_MSB=onewire_readbyte(); data_LSB=onewire_readbyte(); temp=make16(data_MSB,data_LSB); temp=temp >> 5; temp_float=(temp *.125); temp_float_faren=((temp_float * 1.8) + 32); }
unsigned int16 eepromfs_getAddress(unsigned int16 varPos) { int8 aux81,aux82; aux82=read_ext_eeprom(varPos); //CCS buggy! aux81=read_ext_eeprom(varPos+1); //CCS buggy! aux82=read_ext_eeprom(varPos); //reals...:( aux81=read_ext_eeprom(varPos+1); //reals...:( return make16(aux82,aux81); }
static void startrecv586(struct net_device *dev) { struct priv *p = netdev_priv(dev); wait_for_scb_cmd(dev); wait_for_scb_cmd_ruc(dev); writew(make16(p->rfd_first), &p->scb->rfa_offset); writeb(RUC_START, &p->scb->cmd_ruc); ni_attn586(); /* */ wait_for_scb_cmd_ruc(dev); /* */ }
static void startrecv586(struct net_device *dev) { struct priv *p = (struct priv *) dev->priv; wait_for_scb_cmd(dev); wait_for_scb_cmd_ruc(dev); writew(make16(p->rfd_first), &p->scb->rfa_offset); writeb(RUC_START, &p->scb->cmd_ruc); ni_attn586(); /* start cmd. */ wait_for_scb_cmd_ruc(dev); /* wait for accept cmd. (no timeout!!) */ }
static void *alloc_rfa(struct net_device *dev,void *ptr) { volatile struct rfd_struct *rfd = (struct rfd_struct *)ptr; volatile struct rbd_struct *rbd; int i; struct priv *p = netdev_priv(dev); memset((char *) rfd,0,sizeof(struct rfd_struct)*(p->num_recv_buffs+rfdadd)); p->rfd_first = rfd; for(i = 0; i < (p->num_recv_buffs+rfdadd); i++) { rfd[i].next = make16(rfd + (i+1) % (p->num_recv_buffs+rfdadd) ); rfd[i].rbd_offset = 0xffff; } rfd[p->num_recv_buffs-1+rfdadd].last = RFD_SUSP; /* RU suspend */ ptr = (void *) (rfd + (p->num_recv_buffs + rfdadd) ); rbd = (struct rbd_struct *) ptr; ptr = (void *) (rbd + p->num_recv_buffs); /* clr descriptors */ memset((char *) rbd,0,sizeof(struct rbd_struct)*(p->num_recv_buffs)); for(i=0;i<p->num_recv_buffs;i++) { rbd[i].next = make16((rbd + (i+1) % p->num_recv_buffs)); rbd[i].size = swab16(RECV_BUFF_SIZE); rbd[i].buffer = make24(ptr); ptr = (char *) ptr + RECV_BUFF_SIZE; } p->rfd_top = p->rfd_first; p->rfd_last = p->rfd_first + (p->num_recv_buffs - 1 + rfdadd); p->scb->rfa_offset = make16(p->rfd_first); p->rfd_first->rbd_offset = make16(rbd); return ptr; }
static void startrecv586(struct device *dev) { struct priv *p = (struct priv *) dev->priv; p->scb->rfa_offset = make16(p->rfd_first); p->scb->cmd = RUC_START; ni_attn586(); /* start cmd. */ while(p->scb->cmd); /* wait for accept cmd. (no timeout!!) */ DELAY(2); /* isn't necess. */ p->scb->cmd = p->scb->status & STAT_MASK; ni_attn586(); /* ack interr */ }
void read_current(){ onewire_init(); onewire_sendbyte(0xCC); //Transmit skip Rom Command onewire_sendbyte(0x69); //0x69 Transmit Read RAM command onewire_sendbyte(0x0E); //Transmit Read start address data_MSB=onewire_readbyte(); data_LSB=onewire_readbyte(); //printf("MSB ====>(%x)\n\r",data_MSB); //printf("LSB ====>(%x)\n\r",data_LSB); current=make16(data_MSB,data_LSB); current=current >> 3; //printf("current====>(%Lu)\n\r",current); current_float=(current*.015625); }
//Read data from SHT1x long SHTRead(void) { int i; long lTmp,lVal1,lVal2,lValue; lVal1=0; lVal2=0; //get MSB from SHT1x for (i=0; i<8; i++) { lVal1<<=1; output_high(SHT1xSCK); //Send Clock Hight lTmp = input(SHT1xDATA); //Read Data Bit output_low(SHT1xSCK); //Send Clock Low if(lTmp) lVal1|=1; //store in lVal1 } //Acknowledge routine for Next byte output_low(SHT1xDATA); output_high(SHT1xSCK); output_float(SHT1xDATA); //Change to Input output_low(SHT1xSCK); //get LSB from SHT1x for (i=0; i<8; i++) { lVal2<<=1; output_high(SHT1xSCK); //Send Clock Hight lTmp = input(SHT1xDATA); //Read Data Bit //delay_us(2); output_low(SHT1xSCK); //Send Clock Low //delay_us(2); if(lTmp) lVal2|=1; //store in lVal2 } lValue = make16(lVal1,lVal2); //Makes a 16 bit number out of two 8 bit numbers. return(lValue); }
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; /* */ }
u16 PMP_read() { u16 dummy; if (_pmp_width == PMP_MODE_16BIT) { PMP_wait(); // wait for PMP to be available dummy = PMDIN1L; // init read cycle, dummy read PMP_wait(); // wait for PMP to be available return (make16(PMDIN1L, PMDIN1H)); } else { PMP_wait(); // wait for PMP to be available dummy = PMDIN1L; // dummy read PMP_wait(); // wait for PMP to be available return (PMDIN1L); // real read } }
color_t ST7735_getColor(u8 module, u8 x, u8 y) { color_t color; u8 ch, cl; if ( x >= ST7735_WIDTH || y >= (ST7735_HEIGHT) ) return; ST7735_low(ST7735[module].pin.cs); // Chip select ST7735_low(ST7735[module].pin.dc); // COMMAND = 0 SPI_write(module,ST7735_CASET); // set column range (x0,x1) ST7735_high(ST7735[module].pin.dc); // DATA = 1 SPI_write(module,0x00); SPI_write(module,x); SPI_write(module,0x00); SPI_write(module,x); ST7735_low(ST7735[module].pin.dc); // COMMAND = 0 SPI_write(module,ST7735_RASET); // set row range (y0,y1) ST7735_high(ST7735[module].pin.dc); // DATA = 1 SPI_write(module,0x00); SPI_write(module,y); SPI_write(module,0x00); SPI_write(module,y); ST7735_low(ST7735[module].pin.dc); // COMMAND = 0 SPI_write(module,ST7735_RAMRD); // Read RAM ST7735_high(ST7735[module].pin.dc); // DATA = 1 ch = SPI_read(module); cl = SPI_read(module); color.c = make16(ch, cl); ST7735_high(ST7735[module].pin.cs); // Chip deselected return color; }
static void sun3_82586_rcv_int(struct net_device *dev) { int status,cnt=0; unsigned short totlen; struct sk_buff *skb; struct rbd_struct *rbd; struct priv *p = netdev_priv(dev); if(debuglevel > 0) printk("R"); for(;(status = p->rfd_top->stat_high) & RFD_COMPL;) { rbd = (struct rbd_struct *) make32(p->rfd_top->rbd_offset); if(status & RFD_OK) /* frame received without error? */ { if( (totlen = swab16(rbd->status)) & RBD_LAST) /* the first and the last buffer? */ { totlen &= RBD_MASK; /* length of this frame */ rbd->status = 0; skb = (struct sk_buff *) dev_alloc_skb(totlen+2); if(skb != NULL) { skb_reserve(skb,2); skb_put(skb,totlen); skb_copy_to_linear_data(skb,(char *) p->base+swab32((unsigned long) rbd->buffer),totlen); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); dev->stats.rx_packets++; } else dev->stats.rx_dropped++; } else { int rstat; /* free all RBD's until RBD_LAST is set */ totlen = 0; while(!((rstat=swab16(rbd->status)) & RBD_LAST)) { totlen += rstat & RBD_MASK; if(!rstat) { printk("%s: Whoops .. no end mark in RBD list\n",dev->name); break; } rbd->status = 0; rbd = (struct rbd_struct *) make32(rbd->next); } totlen += rstat & RBD_MASK; rbd->status = 0; printk("%s: received oversized frame! length: %d\n",dev->name,totlen); dev->stats.rx_dropped++; } } else /* frame !(ok), only with 'save-bad-frames' */ { printk("%s: oops! rfd-error-status: %04x\n",dev->name,status); dev->stats.rx_errors++; } p->rfd_top->stat_high = 0; p->rfd_top->last = RFD_SUSP; /* maybe exchange by RFD_LAST */ p->rfd_top->rbd_offset = 0xffff; p->rfd_last->last = 0; /* delete RFD_SUSP */ p->rfd_last = p->rfd_top; p->rfd_top = (struct rfd_struct *) make32(p->rfd_top->next); /* step to next RFD */ p->scb->rfa_offset = make16(p->rfd_top); if(debuglevel > 0) printk("%d",cnt++); } if(automatic_resume) { WAIT_4_SCB_CMD(); p->scb->cmd_ruc = RUC_RESUME; sun3_attn586(); WAIT_4_SCB_CMD_RUC(); } #ifdef WAIT_4_BUSY { int i; for(i=0;i<1024;i++) { if(p->rfd_top->status) break; DELAY_16(); if(i == 1023) printk("%s: RU hasn't fetched next RFD (not busy/complete)\n",dev->name); } } #endif #if 0 if(!at_least_one) { int i; volatile struct rfd_struct *rfds=p->rfd_top; volatile struct rbd_struct *rbds; printk("%s: received a FC intr. without having a frame: %04x %d\n",dev->name,status,old_at_least); for(i=0;i< (p->num_recv_buffs+4);i++) { rbds = (struct rbd_struct *) make32(rfds->rbd_offset); printk("%04x:%04x ",rfds->status,rbds->status); rfds = (struct rfd_struct *) make32(rfds->next); } printk("\nerrs: %04x %04x stat: %04x\n",(int)p->scb->rsc_errs,(int)p->scb->ovrn_errs,(int)p->scb->status); printk("\nerrs: %04x %04x rus: %02x, cus: %02x\n",(int)p->scb->rsc_errs,(int)p->scb->ovrn_errs,(int)p->scb->rus,(int)p->scb->cus); } old_at_least = at_least_one; #endif if(debuglevel > 0) printk("r"); }
static int init586(struct net_device *dev) { void *ptr; int i,result=0; struct priv *p = netdev_priv(dev); volatile struct configure_cmd_struct *cfg_cmd; volatile struct iasetup_cmd_struct *ias_cmd; volatile struct tdr_cmd_struct *tdr_cmd; volatile struct mcsetup_cmd_struct *mc_cmd; struct netdev_hw_addr *ha; int num_addrs=netdev_mc_count(dev); ptr = (void *) ((char *)p->scb + sizeof(struct scb_struct)); cfg_cmd = (struct configure_cmd_struct *)ptr; /* configure-command */ cfg_cmd->cmd_status = 0; cfg_cmd->cmd_cmd = swab16(CMD_CONFIGURE | CMD_LAST); cfg_cmd->cmd_link = 0xffff; cfg_cmd->byte_cnt = 0x0a; /* number of cfg bytes */ cfg_cmd->fifo = fifo; /* fifo-limit (8=tx:32/rx:64) */ cfg_cmd->sav_bf = 0x40; /* hold or discard bad recv frames (bit 7) */ cfg_cmd->adr_len = 0x2e; /* addr_len |!src_insert |pre-len |loopback */ cfg_cmd->priority = 0x00; cfg_cmd->ifs = 0x60; cfg_cmd->time_low = 0x00; cfg_cmd->time_high = 0xf2; cfg_cmd->promisc = 0; if(dev->flags & IFF_ALLMULTI) { int len = ((char *) p->iscp - (char *) ptr - 8) / 6; if(num_addrs > len) { printk("%s: switching to promisc. mode\n",dev->name); cfg_cmd->promisc = 1; } } if(dev->flags&IFF_PROMISC) cfg_cmd->promisc = 1; cfg_cmd->carr_coll = 0x00; p->scb->cbl_offset = make16(cfg_cmd); p->scb->cmd_ruc = 0; p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */ sun3_attn586(); WAIT_4_STAT_COMPL(cfg_cmd); if((swab16(cfg_cmd->cmd_status) & (STAT_OK|STAT_COMPL)) != (STAT_COMPL|STAT_OK)) { printk("%s: configure command failed: %x\n",dev->name,swab16(cfg_cmd->cmd_status)); return 1; } /* * individual address setup */ ias_cmd = (struct iasetup_cmd_struct *)ptr; ias_cmd->cmd_status = 0; ias_cmd->cmd_cmd = swab16(CMD_IASETUP | CMD_LAST); ias_cmd->cmd_link = 0xffff; memcpy((char *)&ias_cmd->iaddr,(char *) dev->dev_addr,ETH_ALEN); p->scb->cbl_offset = make16(ias_cmd); p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */ sun3_attn586(); WAIT_4_STAT_COMPL(ias_cmd); if((swab16(ias_cmd->cmd_status) & (STAT_OK|STAT_COMPL)) != (STAT_OK|STAT_COMPL)) { printk("%s (82586): individual address setup command failed: %04x\n",dev->name,swab16(ias_cmd->cmd_status)); return 1; } /* * TDR, wire check .. e.g. no resistor e.t.c */ tdr_cmd = (struct tdr_cmd_struct *)ptr; tdr_cmd->cmd_status = 0; tdr_cmd->cmd_cmd = swab16(CMD_TDR | CMD_LAST); tdr_cmd->cmd_link = 0xffff; tdr_cmd->status = 0; p->scb->cbl_offset = make16(tdr_cmd); p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */ sun3_attn586(); WAIT_4_STAT_COMPL(tdr_cmd); if(!(swab16(tdr_cmd->cmd_status) & STAT_COMPL)) { printk("%s: Problems while running the TDR.\n",dev->name); } else { DELAY_16(); /* wait for result */ result = swab16(tdr_cmd->status); p->scb->cmd_cuc = p->scb->cus & STAT_MASK; sun3_attn586(); /* ack the interrupts */ if(result & TDR_LNK_OK) ; else if(result & TDR_XCVR_PRB) printk("%s: TDR: Transceiver problem. Check the cable(s)!\n",dev->name); else if(result & TDR_ET_OPN) printk("%s: TDR: No correct termination %d clocks away.\n",dev->name,result & TDR_TIMEMASK); else if(result & TDR_ET_SRT) { if (result & TDR_TIMEMASK) /* time == 0 -> strange :-) */ printk("%s: TDR: Detected a short circuit %d clocks away.\n",dev->name,result & TDR_TIMEMASK); } else printk("%s: TDR: Unknown status %04x\n",dev->name,result); } /* * Multicast setup */ if(num_addrs && !(dev->flags & IFF_PROMISC) ) { mc_cmd = (struct mcsetup_cmd_struct *) ptr; mc_cmd->cmd_status = 0; mc_cmd->cmd_cmd = swab16(CMD_MCSETUP | CMD_LAST); mc_cmd->cmd_link = 0xffff; mc_cmd->mc_cnt = swab16(num_addrs * 6); i = 0; netdev_for_each_mc_addr(ha, dev) memcpy((char *) mc_cmd->mc_list[i++], ha->addr, ETH_ALEN); p->scb->cbl_offset = make16(mc_cmd); p->scb->cmd_cuc = CUC_START; sun3_attn586(); WAIT_4_STAT_COMPL(mc_cmd); if( (swab16(mc_cmd->cmd_status) & (STAT_COMPL|STAT_OK)) != (STAT_COMPL|STAT_OK) ) printk("%s: Can't apply multicast-address-list.\n",dev->name); } /* * alloc nop/xmit-cmds */ #if (NUM_XMIT_BUFFS == 1) for(i=0;i<2;i++) { p->nop_cmds[i] = (struct nop_cmd_struct *)ptr; p->nop_cmds[i]->cmd_cmd = swab16(CMD_NOP); p->nop_cmds[i]->cmd_status = 0; p->nop_cmds[i]->cmd_link = make16((p->nop_cmds[i])); ptr = (char *) ptr + sizeof(struct nop_cmd_struct); } #else for(i=0;i<NUM_XMIT_BUFFS;i++) { p->nop_cmds[i] = (struct nop_cmd_struct *)ptr; p->nop_cmds[i]->cmd_cmd = swab16(CMD_NOP); p->nop_cmds[i]->cmd_status = 0; p->nop_cmds[i]->cmd_link = make16((p->nop_cmds[i])); ptr = (char *) ptr + sizeof(struct nop_cmd_struct); } #endif ptr = alloc_rfa(dev,(void *)ptr); /* init receive-frame-area */ /* * alloc xmit-buffs / init xmit_cmds */ for(i=0;i<NUM_XMIT_BUFFS;i++) { p->xmit_cmds[i] = (struct transmit_cmd_struct *)ptr; /*transmit cmd/buff 0*/ ptr = (char *) ptr + sizeof(struct transmit_cmd_struct); p->xmit_cbuffs[i] = (char *)ptr; /* char-buffs */ ptr = (char *) ptr + XMIT_BUFF_SIZE; p->xmit_buffs[i] = (struct tbd_struct *)ptr; /* TBD */ ptr = (char *) ptr + sizeof(struct tbd_struct); if((void *)ptr > (void *)dev->mem_end) { printk("%s: not enough shared-mem for your configuration!\n",dev->name); return 1; } memset((char *)(p->xmit_cmds[i]) ,0, sizeof(struct transmit_cmd_struct)); memset((char *)(p->xmit_buffs[i]),0, sizeof(struct tbd_struct)); p->xmit_cmds[i]->cmd_link = make16(p->nop_cmds[(i+1)%NUM_XMIT_BUFFS]); p->xmit_cmds[i]->cmd_status = swab16(STAT_COMPL); p->xmit_cmds[i]->cmd_cmd = swab16(CMD_XMIT | CMD_INT); p->xmit_cmds[i]->tbd_offset = make16((p->xmit_buffs[i])); p->xmit_buffs[i]->next = 0xffff; p->xmit_buffs[i]->buffer = make24((p->xmit_cbuffs[i])); } p->xmit_count = 0; p->xmit_last = 0; #ifndef NO_NOPCOMMANDS p->nop_point = 0; #endif /* * 'start transmitter' */ #ifndef NO_NOPCOMMANDS p->scb->cbl_offset = make16(p->nop_cmds[0]); p->scb->cmd_cuc = CUC_START; sun3_attn586(); WAIT_4_SCB_CMD(); #else p->xmit_cmds[0]->cmd_link = make16(p->xmit_cmds[0]); p->xmit_cmds[0]->cmd_cmd = swab16(CMD_XMIT | CMD_SUSPEND | CMD_INT); #endif /* * ack. interrupts */ p->scb->cmd_cuc = p->scb->cus & STAT_MASK; sun3_attn586(); DELAY_16(); sun3_enaint(); sun3_active(); return 0; }
static int sun3_82586_send_packet(struct sk_buff *skb, struct net_device *dev) { int len,i; #ifndef NO_NOPCOMMANDS int next_nop; #endif struct priv *p = netdev_priv(dev); if(skb->len > XMIT_BUFF_SIZE) { printk("%s: Sorry, max. framelength is %d bytes. The length of your frame is %d bytes.\n",dev->name,XMIT_BUFF_SIZE,skb->len); return NETDEV_TX_OK; } netif_stop_queue(dev); #if(NUM_XMIT_BUFFS > 1) if(test_and_set_bit(0,(void *) &p->lock)) { printk("%s: Queue was locked\n",dev->name); return NETDEV_TX_BUSY; } else #endif { len = skb->len; if (len < ETH_ZLEN) { memset((void *)p->xmit_cbuffs[p->xmit_count], 0, ETH_ZLEN); len = ETH_ZLEN; } skb_copy_from_linear_data(skb, (void *)p->xmit_cbuffs[p->xmit_count], skb->len); #if (NUM_XMIT_BUFFS == 1) # ifdef NO_NOPCOMMANDS #ifdef DEBUG if(p->scb->cus & CU_ACTIVE) { printk("%s: Hmmm .. CU is still running and we wanna send a new packet.\n",dev->name); printk("%s: stat: %04x %04x\n",dev->name,p->scb->cus,swab16(p->xmit_cmds[0]->cmd_status)); } #endif p->xmit_buffs[0]->size = swab16(TBD_LAST | len); for(i=0;i<16;i++) { p->xmit_cmds[0]->cmd_status = 0; WAIT_4_SCB_CMD(); if( (p->scb->cus & CU_STATUS) == CU_SUSPEND) p->scb->cmd_cuc = CUC_RESUME; else { p->scb->cbl_offset = make16(p->xmit_cmds[0]); p->scb->cmd_cuc = CUC_START; } sun3_attn586(); if(!i) dev_kfree_skb(skb); WAIT_4_SCB_CMD(); if( (p->scb->cus & 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 = swab16(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])); p->nop_point = next_nop; dev_kfree_skb(skb); # endif #else p->xmit_buffs[p->xmit_count]->size = swab16(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; /* linkpointer of xmit-command already points to next nop cmd */ 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])); p->xmit_count = next_nop; { unsigned long flags; local_irq_save(flags); if(p->xmit_count != p->xmit_last) netif_wake_queue(dev); p->lock = 0; local_irq_restore(flags); } dev_kfree_skb(skb); #endif } return NETDEV_TX_OK; }