Changeset d3c9b60 in mainline for uspace/srv/hw/netif/dp8390/ne2000.c
- Timestamp:
- 2011-01-06T14:42:39Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 506a805
- Parents:
- 95ff5c4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hw/netif/dp8390/ne2000.c
r95ff5c4 rd3c9b60 73 73 void ne_init(struct dpeth *dep); 74 74 75 /*===========================================================================* 76 * ne_probe * 77 *===========================================================================*/ 78 int ne_probe(dep) 79 dpeth_t *dep; 75 int ne_probe(dpeth_t *dep) 80 76 { 81 77 int byte; … … 83 79 int loc1, loc2; 84 80 testf_t f; 85 86 dep->de_dp8390_port= dep->de_base_port + NE_DP8390; 87 88 /* We probe for an ne1000 or an ne2000 by testing whether the 81 82 dep->de_dp8390_port = dep->de_base_port + NE_DP8390; 83 84 /* 85 * We probe for an ne1000 or an ne2000 by testing whether the 89 86 * on board is reachable through the dp8390. Note that the 90 87 * ne1000 is an 8bit card and has a memory region distict from 91 88 * the 16bit ne2000 92 89 */ 93 94 for (dep->de_16bit= 0; dep->de_16bit < 2; dep->de_16bit++) 95 { 90 91 for (dep->de_16bit = 0; dep->de_16bit < 2; dep->de_16bit++) { 96 92 /* Reset the ethernet card */ 97 93 byte= inb_ne(dep, NE_RESET); … … 99 95 outb_ne(dep, NE_RESET, byte); 100 96 milli_delay(2); 101 97 102 98 /* Reset the dp8390 */ 103 99 outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT); 104 for (i = 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) &ISR_RST) == 0); i++)100 for (i = 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RST) == 0); i++) 105 101 ; /* Do nothing */ 106 102 107 103 /* Check if the dp8390 is really there */ 108 if ((inb_reg0(dep, DP_CR) &(CR_STP|CR_DM_ABORT)) != 109 (CR_STP|CR_DM_ABORT)) 110 { 104 if ((inb_reg0(dep, DP_CR) & (CR_STP | CR_DM_ABORT)) != 105 (CR_STP | CR_DM_ABORT)) 111 106 return 0; 112 } 113 107 114 108 /* Disable the receiver and init TCR and DCR. */ 115 109 outb_reg0(dep, DP_RCR, RCR_MON); 116 110 outb_reg0(dep, DP_TCR, TCR_NORMAL); 117 if (dep->de_16bit) 118 { 111 if (dep->de_16bit) { 119 112 outb_reg0(dep, DP_DCR, DCR_WORDWIDE | DCR_8BYTES | 120 DCR_BMS); 121 } 122 else 123 { 113 DCR_BMS); 114 } else { 124 115 outb_reg0(dep, DP_DCR, DCR_BYTEWIDE | DCR_8BYTES | 125 DCR_BMS); 126 } 127 128 if (dep->de_16bit) 129 { 116 DCR_BMS); 117 } 118 119 if (dep->de_16bit) { 130 120 loc1= NE2000_START; 131 121 loc2= NE2000_START + NE2000_SIZE - 4; 132 122 f= test_16; 133 } 134 else 135 { 123 } else { 136 124 loc1= NE1000_START; 137 125 loc2= NE1000_START + NE1000_SIZE - 4; 138 126 f= test_8; 139 127 } 140 if (f(dep, loc1, pat0) && f(dep, loc1, pat1) &&141 f(dep, loc1, pat2) && f(dep, loc1, pat3) &&142 f(dep, loc2, pat0) && f(dep, loc2, pat1) &&143 f(dep, loc2, pat2) && f(dep, loc2, pat3))144 {128 129 if (f(dep, loc1, pat0) && f(dep, loc1, pat1) && 130 f(dep, loc1, pat2) && f(dep, loc1, pat3) && 131 f(dep, loc2, pat0) && f(dep, loc2, pat1) && 132 f(dep, loc2, pat2) && f(dep, loc2, pat3)) { 145 133 /* We don't need a memory segment */ 146 dep->de_linmem= 0; 147 if (!dep->de_pci) 148 dep->de_initf= ne_init; 149 dep->de_stopf= ne_stop; 134 dep->de_linmem = 0; 135 dep->de_initf = ne_init; 136 dep->de_stopf = ne_stop; 150 137 return 1; 151 138 } 152 139 } 140 153 141 return 0; 154 142 } 155 143 156 /*===========================================================================* 157 * ne_init * 158 *===========================================================================*/ 159 void ne_init(dep) 160 dpeth_t *dep; 144 void ne_init(dpeth_t *dep) 161 145 { 162 146 int i; 163 147 int word, sendq_nr; 164 148 165 149 /* Setup a transfer to get the ethernet address. */ 166 150 if (dep->de_16bit) … … 168 152 else 169 153 outb_reg0(dep, DP_RBCR0, 6); 154 170 155 outb_reg0(dep, DP_RBCR1, 0); 171 156 outb_reg0(dep, DP_RSAR0, 0); 172 157 outb_reg0(dep, DP_RSAR1, 0); 173 158 outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); 174 175 for (i= 0; i<6; i++) 176 { 177 if (dep->de_16bit) 178 { 179 word= inw_ne(dep, NE_DATA); 180 dep->de_address.ea_addr[i]= word; 181 } 182 else 183 { 159 160 for (i = 0; i < 6; i++) { 161 if (dep->de_16bit) { 162 word = inw_ne(dep, NE_DATA); 163 dep->de_address.ea_addr[i] = word; 164 } else 184 165 dep->de_address.ea_addr[i] = inb_ne(dep, NE_DATA); 185 186 }166 } 167 187 168 dep->de_data_port= dep->de_base_port + NE_DATA; 188 if (dep->de_16bit) 189 { 169 if (dep->de_16bit) { 190 170 dep->de_ramsize= NE2000_SIZE; 191 171 dep->de_offset_page= NE2000_START / DP_PAGESIZE; 192 } 193 else 194 { 172 } else { 195 173 dep->de_ramsize= NE1000_SIZE; 196 174 dep->de_offset_page= NE1000_START / DP_PAGESIZE; 197 175 } 198 176 199 177 /* Allocate one send buffer (1.5KB) per 8KB of on board memory. */ 200 178 sendq_nr= dep->de_ramsize / 0x2000; 179 201 180 if (sendq_nr < 1) 202 sendq_nr = 1;181 sendq_nr = 1; 203 182 else if (sendq_nr > SENDQ_NR) 204 sendq_nr= SENDQ_NR; 205 dep->de_sendq_nr= sendq_nr; 206 for (i= 0; i<sendq_nr; i++) 207 { 208 dep->de_sendq[i].sq_sendpage= dep->de_offset_page + 209 i*SENDQ_PAGES; 210 } 211 212 dep->de_startpage= dep->de_offset_page + i*SENDQ_PAGES; 213 dep->de_stoppage= dep->de_offset_page + dep->de_ramsize / DP_PAGESIZE; 214 183 sendq_nr = SENDQ_NR; 184 185 dep->de_sendq_nr = sendq_nr; 186 for (i = 0; i < sendq_nr; i++) 187 dep->de_sendq[i].sq_sendpage= dep->de_offset_page + i * SENDQ_PAGES; 188 189 dep->de_startpage = dep->de_offset_page + i * SENDQ_PAGES; 190 dep->de_stoppage = dep->de_offset_page + dep->de_ramsize / DP_PAGESIZE; 191 215 192 /* Can't override the default IRQ. */ 216 193 dep->de_irq &= ~DEI_DEFAULT; 217 194 218 195 if (!debug) 219 196 {
Note:
See TracChangeset
for help on using the changeset viewer.