Changeset 5a820308 in rtems
- Timestamp:
- 12/03/99 13:42:34 (24 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- 5707fe9
- Parents:
- fc81cc9
- Location:
- c/src
- Files:
-
- 4 added
- 1 deleted
- 6 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/i386/pc386/Makefile.in
rfc81cc9 r5a820308 20 20 21 21 # We only build the Network library if HAS_NETWORKING was defined 22 NETWORK_yes_V = dec21140 ne2000 wd8003 3c509 22 # dec21140 is supported via libchip 23 NETWORK_yes_V = ne2000 wd8003 3c509 23 24 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V) 24 25 -
c/src/lib/libbsp/i386/pc386/wrapup/Makefile.in
rfc81cc9 r5a820308 15 15 16 16 # We only build the Network library if HAS_NETWORKING was defined 17 NETWORK_yes_V = dec21140 ne2000 wd8003 3c509 17 # dec21140 is supported via libchip 18 NETWORK_yes_V = ne2000 wd8003 3c509 18 19 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V) 19 20 -
c/src/lib/libbsp/powerpc/mcp750/Makefile.in
rfc81cc9 r5a820308 23 23 all: $(SRCS) 24 24 25 # We only build the Network library if HAS_NETWORKING was defined26 NETWORK_yes_V = dec2114027 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V)28 29 25 # wrapup is the one that actually builds and installs the library 30 26 # from the individual .rel files built in other directories 31 27 SUBDIRS = clock console include pci residual openpic irq vectors start \ 32 startup bootloader $(NETWORK)motorola wrapup28 startup bootloader motorola wrapup 33 29 34 30 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status -
c/src/lib/libbsp/powerpc/mcp750/wrapup/Makefile.in
rfc81cc9 r5a820308 14 14 VPATH = @srcdir@ 15 15 16 # We only build the Network library if HAS_NETWORKING was defined 17 NETWORK_yes_V = dec21140 18 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V) 19 20 BSP_PIECES = clock console irq openpic pci residual startup $(NETWORK) \ 21 vectors motorola 16 BSP_PIECES = clock console irq openpic pci residual startup vectors motorola 22 17 GENERIC_PIECES = 23 18 -
c/src/lib/libbsp/powerpc/motorola_powerpc/Makefile.in
rfc81cc9 r5a820308 23 23 all: $(SRCS) 24 24 25 # We only build the Network library if HAS_NETWORKING was defined26 NETWORK_yes_V = dec2114027 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V)28 29 25 # wrapup is the one that actually builds and installs the library 30 26 # from the individual .rel files built in other directories 31 27 SUBDIRS = clock console include pci residual openpic irq vectors start \ 32 startup bootloader $(NETWORK)motorola wrapup28 startup bootloader motorola wrapup 33 29 34 30 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status -
c/src/lib/libbsp/powerpc/motorola_powerpc/wrapup/Makefile.in
rfc81cc9 r5a820308 14 14 VPATH = @srcdir@ 15 15 16 # We only build the Network library if HAS_NETWORKING was defined 17 NETWORK_yes_V = dec21140 18 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V) 19 20 BSP_PIECES = clock console irq openpic pci residual startup $(NETWORK) \ 21 vectors motorola 16 BSP_PIECES = clock console irq openpic pci residual startup vectors motorola 22 17 GENERIC_PIECES = 23 18 -
c/src/libchip/network/dec21140.c
rfc81cc9 r5a820308 1 1 /* 2 * RTEMS driver for TULIP based Ethernet Controller2 * RTEMS driver for TULIP based Ethernet Controller 3 3 * 4 * $Header$ 4 * Copyright (C) 1999 Emmanuel Raguet. raguet@crf.canon.fr 5 * 6 * The license and distribution terms for this file may be 7 * found in found in the file LICENSE in this distribution or at 8 * http://www.OARcorp.com/rtems/license.html. 9 * 10 * $Id$ 5 11 */ 6 12 7 13 #include <bsp.h> 14 #if defined(i386) 8 15 #include <pcibios.h> 16 #endif 17 #if defined(__PPC) 18 #include <bsp/pci.h> 19 #include <libcpu/byteorder.h> 20 #include <libcpu/io.h> 21 #endif 9 22 10 23 #include <stdlib.h> … … 25 38 #include <netinet/if_ether.h> 26 39 40 #if defined(i386) 27 41 #include <irq.h> 42 #endif 43 #if defined(__PPC) 44 #include <bsp/irq.h> 45 #endif 28 46 29 47 #ifdef malloc … … 34 52 #endif 35 53 54 #define DEC_DEBUG 55 56 #define PCI_INVALID_VENDORDEVICEID 0xffffffff 36 57 #define PCI_VENDOR_ID_DEC 0x1011 37 58 #define PCI_DEVICE_ID_DEC_TULIP_FAST 0x0009 … … 39 60 #define IO_MASK 0x3 40 61 #define MEM_MASK 0xF 62 #define MASK_OFFSET 0xF 41 63 42 64 /* command and status registers, 32-bit access, only if IO-ACCESS */ … … 79 101 80 102 #define RESET_CHIP 0x00000001 81 #define CSR0_MODE 0x01a08000 /* 01a08000 */ 103 #if defined(__PPC) 104 #define CSR0_MODE 0x0030e002 /* 01b08000 */ 105 #else 106 #define CSR0_MODE 0x0020e002 /* 01b08000 */ 107 #endif 82 108 #define ROM_ADDRESS 0x00004800 83 #define CSR6_INIT 0x02 0c0000 /*020c0000 */109 #define CSR6_INIT 0x022cc000 /* 022c0000 020c0000 */ 84 110 #define CSR6_TX 0x00002000 85 111 #define CSR6_TXRX 0x00002002 86 #define IT_SETUP 0x000100 40 /* 0001ebef*/112 #define IT_SETUP 0x000100c0 /* 000100e0 */ 87 113 #define CLEAR_IT 0xFFFFFFFF 88 114 #define NO_IT 0x00000000 89 115 90 #define NRXBUFS 7/* number of receive buffers */91 #define NTXBUFS 1 /* number of transmit buffers */116 #define NRXBUFS 32 /* number of receive buffers */ 117 #define NTXBUFS 16 /* number of transmit buffers */ 92 118 93 119 /* message descriptor entry */ 94 120 struct MD { 95 volatile unsigned long status; 96 volatile unsigned long counts; 97 unsigned long buf1, buf2; 121 /* used by hardware */ 122 volatile unsigned32 status; 123 volatile unsigned32 counts; 124 unsigned32 buf1, buf2; 125 /* used by software */ 126 volatile struct mbuf *m; 127 volatile struct MD *next; 98 128 }; 99 129 100 130 /* 101 * Number of WDs supported by this driver131 * Number of DECs supported by this driver 102 132 */ 103 133 #define NDECDRIVER 1 … … 122 152 #define START_TRANSMIT_EVENT RTEMS_EVENT_2 123 153 154 #if defined(__PPC) 155 #define phys_to_bus(address) ((unsigned int)(address) + PREP_PCI_DRAM_OFFSET) 156 #define bus_to_phys(address) ((unsigned int)(address) - PREP_PCI_DRAM_OFFSET) 157 #define CPU_CACHE_ALIGNMENT_FOR_BUFFER PPC_CACHE_ALIGNMENT 158 #else 159 #define phys_to_bus(address) address 160 #define bus_to_phys(address) address 161 #define delay_in_bus_cycles(cycle) Wait_X_ms( cycle/100 ) 162 #define CPU_CACHE_ALIGNMENT_FOR_BUFFER PG_SIZE 163 164 inline void st_le32(volatile unsigned32 *addr, unsigned32 value) 165 { 166 *(addr)=value ; 167 } 168 169 inline unsigned32 ld_le32(volatile unsigned32 *addr) 170 { 171 return(*addr); 172 } 173 174 #endif 175 124 176 #if (MCLBYTES < RBUF_SIZE) 125 177 # error "Driver must have MCLBYTES > RBUF_SIZE" … … 130 182 */ 131 183 struct dec21140_softc { 132 struct arpcom arpcom; 133 rtems_irq_connect_data irqInfo; 134 struct MD *MDbase; 135 char *bufferBase; 136 int acceptBroadcast; 137 int rxBdCount; 138 int txBdCount; 139 rtems_id rxDaemonTid; 140 rtems_id txDaemonTid; 184 185 struct arpcom arpcom; 186 187 rtems_irq_connect_data irqInfo; 188 189 volatile struct MD *MDbase; 190 volatile unsigned char *bufferBase; 191 int acceptBroadcast; 192 rtems_id rxDaemonTid; 193 rtems_id txDaemonTid; 194 195 volatile struct MD *TxMD; 196 volatile struct MD *SentTxMD; 197 int PendingTxCount; 198 int TxSuspended; 141 199 142 200 unsigned int port; 143 unsigned int *base; 144 unsigned long bpar; 201 volatile unsigned int *base; 145 202 146 203 /* … … 175 232 dec21140Enet_interrupt_handler (rtems_vector_number v) 176 233 { 177 unsigned int *tbase; 178 unsigned long status; 179 180 unsigned int sc; 181 182 tbase = dec21140_softc[0].base ; 183 184 /* 185 * Read status 186 */ 187 *(tbase+memCSR7) = NO_IT; 188 status = *(tbase+memCSR5); 189 *(tbase+memCSR5) = CLEAR_IT; 190 191 /* 192 * Frame received? 193 */ 194 if (status & 0x00000040){ 195 dec21140_softc[0].rxInterrupts++; 196 sc = rtems_event_send (dec21140_softc[0].rxDaemonTid, INTERRUPT_EVENT); 197 } 234 volatile unsigned32 *tbase; 235 unsigned32 status; 236 struct dec21140_softc *sc; 237 238 sc = &dec21140_softc[0]; 239 tbase = (unsigned32 *)(sc->base) ; 240 241 /* 242 * Read status 243 */ 244 status = ld_le32(tbase+memCSR5); 245 st_le32((tbase+memCSR5), status); /* clear the bits we've read */ 246 247 /* 248 * Frame received? 249 */ 250 if (status & 0x000000c0){ 251 sc->rxInterrupts++; 252 rtems_event_send (sc->rxDaemonTid, INTERRUPT_EVENT); 253 } 198 254 } 199 255 … … 211 267 } 212 268 213 /*214 * Read and write the MII registers using software-generated serial215 * MDIO protocol.216 */217 #define MDIO_SHIFT_CLK 0x10000218 #define MDIO_DATA_WRITE0 0x00000219 #define MDIO_DATA_WRITE1 0x20000220 #define MDIO_ENB 0x00000221 #define MDIO_ENB_IN 0x40000222 #define MDIO_DATA_READ 0x80000223 224 static int mdio_read(unsigned int *ioaddr, int phy_id, int location)225 {226 int i, i3;227 int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;228 unsigned short retval = 0;229 230 /* Establish sync by sending at least 32 logic ones. */231 for (i = 32; i >= 0; i--) {232 *ioaddr = MDIO_ENB | MDIO_DATA_WRITE1;233 for(i3=0; i3<1000; i3++);234 *ioaddr = MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK;235 for(i3=0; i3<1000; i3++);236 }237 /* Shift the read command bits out. */238 for (i = 17; i >= 0; i--) {239 int dataval = (read_cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;240 *ioaddr = dataval;241 for(i3=0; i3<1000; i3++);242 *ioaddr = dataval | MDIO_SHIFT_CLK;243 for(i3=0; i3<1000; i3++);244 *ioaddr = dataval;245 for(i3=0; i3<1000; i3++);246 }247 *ioaddr = MDIO_ENB_IN | MDIO_SHIFT_CLK;248 for(i3=0; i3<1000; i3++);249 *ioaddr = MDIO_ENB_IN;250 251 for (i = 16; i > 0; i--) {252 *ioaddr = MDIO_ENB_IN | MDIO_SHIFT_CLK;253 for(i3=0; i3<1000; i3++);254 retval = (retval << 1) | ((*ioaddr & MDIO_DATA_READ) ? 1 : 0);255 *ioaddr = MDIO_ENB_IN;256 for(i3=0; i3<1000; i3++);257 }258 /* Clear out extra bits. */259 for (i = 16; i > 0; i--) {260 *ioaddr = MDIO_ENB_IN | MDIO_SHIFT_CLK;261 for(i3=0; i3<1000; i3++);262 *ioaddr = MDIO_ENB_IN;263 for(i3=0; i3<1000; i3++);264 }265 return retval;266 }267 268 static int mdio_write(unsigned int *ioaddr, int phy_id, int location, int value)269 {270 int i, i3;271 int cmd = (0x5002 << 16) | (phy_id << 23) | (location << 18) | value;272 273 /* Establish sync by sending at least 32 logic ones. */274 for (i = 32; i >= 0; i--) {275 *ioaddr = MDIO_ENB | MDIO_DATA_WRITE1;276 for(i3=0; i3<1000; i3++);277 *ioaddr = MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK;278 for(i3=0; i3<1000; i3++);279 }280 /* Shift the read command bits out. */281 for (i = 31; i >= 0; i--) {282 int dataval = (cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;283 *ioaddr = dataval;284 for(i3=0; i3<1000; i3++);285 *ioaddr = dataval | MDIO_SHIFT_CLK;286 for(i3=0; i3<1000; i3++);287 }288 289 /* Clear out extra bits. */290 for (i = 2; i > 0; i--) {291 *ioaddr = MDIO_ENB_IN;292 for(i3=0; i3<1000; i3++);293 *ioaddr = MDIO_ENB_IN | MDIO_SHIFT_CLK;294 for(i3=0; i3<1000; i3++);295 }296 return 0;297 298 299 }300 269 301 270 /* … … 316 285 #define EE_ERASE_CMD (7 << 6) 317 286 318 static int eeget16( unsigned int *ioaddr, int location)319 { 320 int i , i3;287 static int eeget16(volatile unsigned int *ioaddr, int location) 288 { 289 int i; 321 290 unsigned short retval = 0; 322 291 int read_cmd = location | EE_READ_CMD; 323 292 324 *ioaddr = EE_ENB & ~EE_CS;325 *ioaddr = EE_ENB;293 st_le32(ioaddr, EE_ENB & ~EE_CS); 294 st_le32(ioaddr, EE_ENB); 326 295 327 296 /* Shift the read command bits out. */ 328 297 for (i = 10; i >= 0; i--) { 329 298 short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; 330 *ioaddr = EE_ENB | dataval;331 for (i3=0; i3<1000; i3++);332 *ioaddr = EE_ENB | dataval | EE_SHIFT_CLK;333 for (i3=0; i3<1000; i3++);334 *ioaddr = EE_ENB | dataval; /* Finish EEPROM a clock tick. */335 for (i3=0; i3<1000; i3++);299 st_le32(ioaddr, EE_ENB | dataval); 300 delay_in_bus_cycles(200); 301 st_le32(ioaddr, EE_ENB | dataval | EE_SHIFT_CLK); 302 delay_in_bus_cycles(200); 303 st_le32(ioaddr, EE_ENB | dataval); /* Finish EEPROM a clock tick. */ 304 delay_in_bus_cycles(200); 336 305 } 337 *ioaddr = EE_ENB;306 st_le32(ioaddr, EE_ENB); 338 307 339 308 for (i = 16; i > 0; i--) { 340 *ioaddr = EE_ENB | EE_SHIFT_CLK;341 for (i3=0; i3<1000; i3++);342 retval = (retval << 1) | (( *ioaddr& EE_DATA_READ) ? 1 : 0);343 *ioaddr = EE_ENB;344 for (i3=0; i3<1000; i3++);309 st_le32(ioaddr, EE_ENB | EE_SHIFT_CLK); 310 delay_in_bus_cycles(200); 311 retval = (retval << 1) | ((ld_le32(ioaddr) & EE_DATA_READ) ? 1 : 0); 312 st_le32(ioaddr, EE_ENB); 313 delay_in_bus_cycles(200); 345 314 } 346 315 347 316 /* Terminate the EEPROM access. */ 348 *ioaddr = EE_ENB & ~EE_CS;349 return retval;317 st_le32(ioaddr, EE_ENB & ~EE_CS); 318 return ( ((retval<<8)&0xff00) | ((retval>>8)&0xff) ); 350 319 } 351 320 … … 357 326 { 358 327 rtems_status_code st; 359 unsigned int *tbase;328 volatile unsigned int *tbase; 360 329 union {char c[64]; unsigned short s[32];} rombuf; 361 int i, i2, i3; 362 char *cp, direction, *setup_frm, *eaddrs; 363 unsigned long csr12_val, mii_reg0; 364 unsigned char *buffer; 365 struct MD *rmd; 366 367 330 int i; 331 volatile unsigned char *cp, *setup_frm, *eaddrs; 332 volatile unsigned char *buffer; 333 volatile struct MD *rmd; 334 368 335 tbase = sc->base; 369 336 … … 372 339 * Then Reset the chip ( 1 in CSR0) 373 340 */ 374 375 *(tbase+memCSR6) = CSR6_INIT; 376 *(tbase+memCSR0) = RESET_CHIP; 377 for(i3=0; i3<1000; i3++); 341 st_le32( (tbase+memCSR6), CSR6_INIT); 342 st_le32( (tbase+memCSR0), RESET_CHIP); 343 delay_in_bus_cycles(200); 378 344 379 345 /* 380 346 * Init CSR0 381 347 */ 382 *(tbase+memCSR0) = CSR0_MODE;383 384 csr12_val = *(tbase+memCSR8);385 386 for (i=0; i<32; i++) 348 st_le32( (tbase+memCSR0), CSR0_MODE); 349 350 /* csr12_val = ld_le32( (tbase+memCSR8) );*/ 351 352 for (i=0; i<32; i++){ 387 353 rombuf.s[i] = eeget16(tbase+memCSR9, i); 354 } 388 355 memcpy (sc->arpcom.ac_enaddr, rombuf.c+20, ETHER_ADDR_LEN); 389 356 390 391 mii_reg0 = mdio_read(tbase+memCSR9, 0, 0);392 mdio_write(tbase+memCSR9, 0, 0, mii_reg0 | 0x1000);393 394 357 #ifdef DEC_DEBUG 395 358 printk("DC21140 %x:%x:%x:%x:%x:%x IRQ %d IO %x M %x .........\n", … … 397 360 sc->arpcom.ac_enaddr[2], sc->arpcom.ac_enaddr[3], 398 361 sc->arpcom.ac_enaddr[4], sc->arpcom.ac_enaddr[5], 399 sc->irqInfo.name, sc->port, sc->base);362 sc->irqInfo.name, sc->port, (unsigned) sc->base); 400 363 #endif 401 364 … … 403 366 * Init RX ring 404 367 */ 405 sc->rxBdCount = 0;406 407 cp = (char *)malloc((NRXBUFS+NTXBUFS)*(sizeof(struct MD)+ RBUF_SIZE) + PG_SIZE);368 cp = (volatile unsigned char *)malloc(((NRXBUFS+NTXBUFS)*sizeof(struct MD)) 369 + (NTXBUFS*RBUF_SIZE) 370 + CPU_CACHE_ALIGNMENT_FOR_BUFFER); 408 371 sc->bufferBase = cp; 409 cp += (PG_SIZE - (int)cp) & MASK_OFFSET; 372 cp += (CPU_CACHE_ALIGNMENT_FOR_BUFFER - (int)cp) 373 & (CPU_CACHE_ALIGNMENT_FOR_BUFFER - 1); 374 #if defined(__i386) 410 375 #ifdef PCI_BRIDGE_DOES_NOT_ENSURE_CACHE_COHERENCY_FOR_DMA 411 376 if (_CPU_is_paging_enabled()) 412 377 _CPU_change_memory_mapping_attribute 413 378 (NULL, cp, 414 (NRXBUFS+NTXBUFS)*(sizeof(struct MD)+ RBUF_SIZE), 379 ((NRXBUFS+NTXBUFS)*sizeof(struct MD)) 380 + (NTXBUFS*RBUF_SIZE), 415 381 PTE_CACHE_DISABLE | PTE_WRITABLE); 416 382 #endif 417 rmd = (struct MD*)cp; 383 #endif 384 rmd = (volatile struct MD*)cp; 418 385 sc->MDbase = rmd; 419 386 buffer = cp + ((NRXBUFS+NTXBUFS)*sizeof(struct MD)); 420 421 *(tbase+memCSR3) = (long)(sc->MDbase); 387 st_le32( (tbase+memCSR3), (long)(phys_to_bus((long)(sc->MDbase)))); 422 388 for (i=0 ; i<NRXBUFS; i++){ 423 rmd->buf2 = 0; 424 rmd->buf1 = (unsigned long)(buffer + (i*RBUF_SIZE)); 425 if (i == NRXBUFS-1) 426 rmd->counts = 0xfec00000 | (RBUF_SIZE); 427 else 428 rmd->counts = 0xfcc00000 | (RBUF_SIZE); 389 struct mbuf *m; 390 391 /* allocate an mbuf for each receive descriptor */ 392 MGETHDR (m, M_WAIT, MT_DATA); 393 MCLGET (m, M_WAIT); 394 m->m_pkthdr.rcvif = &sc->arpcom.ac_if; 395 rmd->m = m; 396 397 rmd->buf2 = phys_to_bus(rmd+1); 398 rmd->buf1 = phys_to_bus(mtod(m, void *)); 399 rmd->counts = 0xfdc00000 | (RBUF_SIZE); 429 400 rmd->status = 0x80000000; 401 rmd->next = rmd + 1; 430 402 rmd++; 431 403 } 404 /* 405 * mark last RX buffer. 406 */ 407 sc->MDbase [NRXBUFS-1].counts = 0xfec00000 | (RBUF_SIZE); 408 sc->MDbase [NRXBUFS-1].next = sc->MDbase; 432 409 433 410 /* 434 411 * Init TX ring 435 412 */ 436 sc->txBdCount = 0; 437 *(tbase+memCSR4) = (long)(rmd); 438 rmd->buf2 = 0; 439 rmd->buf1 = (unsigned long)(buffer + (NRXBUFS*RBUF_SIZE)); 440 rmd->counts = 0x62000000; 441 rmd->status = 0x0; 413 st_le32( (tbase+memCSR4), (long)(phys_to_bus((long)(rmd))) ); 414 for (i=0 ; i<NTXBUFS; i++){ 415 (rmd+i)->buf2 = phys_to_bus(rmd+i+1); 416 (rmd+i)->buf1 = phys_to_bus(buffer + (i*RBUF_SIZE)); 417 (rmd+i)->counts = 0x01000000; 418 (rmd+i)->status = 0x0; 419 (rmd+i)->next = rmd+i+1; 420 (rmd+i)->m = 0; 421 } 422 423 /* 424 * mark last TX buffer. 425 */ 426 (rmd+NTXBUFS-1)->buf2 = phys_to_bus(rmd); 427 (rmd+NTXBUFS-1)->next = rmd; 442 428 443 429 /* 444 430 * Set up interrupts 445 431 */ 446 *(tbase+memCSR5) = IT_SETUP;447 *(tbase+memCSR7) = IT_SETUP;448 449 432 sc->irqInfo.hdl = (rtems_irq_hdl)dec21140Enet_interrupt_handler; 450 433 sc->irqInfo.on = nopOn; … … 456 439 sc->irqInfo.name); 457 440 458 /* 459 * Start TX for setup frame 460 */ 461 *(tbase+memCSR6) = CSR6_INIT | CSR6_TX; 441 st_le32( (tbase+memCSR7), NO_IT); 462 442 463 443 /* 464 444 * Build setup frame 465 445 */ 466 setup_frm = ( char *)(rmd->buf1);446 setup_frm = (volatile unsigned char *)(bus_to_phys(rmd->buf1)); 467 447 eaddrs = (char *)(sc->arpcom.ac_enaddr); 468 448 /* Fill the buffer with our physical address. */ … … 470 450 *setup_frm++ = eaddrs[0]; 471 451 *setup_frm++ = eaddrs[1]; 472 setup_frm += 2; 452 *setup_frm++ = eaddrs[0]; 453 *setup_frm++ = eaddrs[1]; 473 454 *setup_frm++ = eaddrs[2]; 474 455 *setup_frm++ = eaddrs[3]; 475 setup_frm += 2; 456 *setup_frm++ = eaddrs[2]; 457 *setup_frm++ = eaddrs[3]; 476 458 *setup_frm++ = eaddrs[4]; 477 459 *setup_frm++ = eaddrs[5]; 478 setup_frm += 2; 460 *setup_frm++ = eaddrs[4]; 461 *setup_frm++ = eaddrs[5]; 479 462 } 480 463 /* Add the broadcast address when doing perfect filtering */ 481 memset( setup_frm, 0xff, 12);482 rmd->counts = 0x0 a000000 | 192 ;464 memset((void*) setup_frm, 0xff, 12); 465 rmd->counts = 0x09000000 | 192 ; 483 466 rmd->status = 0x80000000; 484 *(tbase+memCSR1) = 1; 467 st_le32( (tbase+memCSR6), CSR6_INIT | CSR6_TX); 468 st_le32( (tbase+memCSR1), 1); 485 469 while (rmd->status != 0x7fffffff); 486 470 rmd->counts = 0x01000000; 471 sc->TxMD = rmd+1; 472 487 473 /* 488 474 * Enable RX and TX 489 475 */ 490 *(tbase+memCSR6) = CSR6_INIT | CSR6_TXRX; 476 st_le32( (tbase+memCSR5), IT_SETUP); 477 st_le32( (tbase+memCSR7), IT_SETUP); 478 st_le32( (unsigned int*)(tbase+memCSR6), CSR6_INIT | CSR6_TXRX); 491 479 492 /*493 * Set up PHY494 */495 496 i = rombuf.c[27];497 i+=2;498 direction = rombuf.c[i];499 i +=4;500 *(tbase+memCSR12) = direction | 0x100;501 for (i2 = 0; i2 < rombuf.c[(i+2) + rombuf.c[i+1]]; i2++){502 *(tbase + memCSR12) = rombuf.c[(i+3) + rombuf.c[i+1] + i2];503 }504 for (i2 = 0; i2 < rombuf.c[i+1]; i2++){505 *(tbase + memCSR12) = rombuf.c[(i+2) + i2];506 }507 480 } 508 481 … … 510 483 dec21140_rxDaemon (void *arg) 511 484 { 512 unsigned int *tbase;485 volatile unsigned int *tbase; 513 486 struct ether_header *eh; 514 487 struct dec21140_softc *dp = (struct dec21140_softc *)&dec21140_softc[0]; 515 488 struct ifnet *ifp = &dp->arpcom.ac_if; 516 489 struct mbuf *m; 517 struct MD *rmd;490 volatile struct MD *rmd; 518 491 unsigned int len; 519 char *temp;520 492 rtems_event_set events; 521 int nbMD;522 493 523 494 tbase = dec21140_softc[0].base ; 495 rmd = dec21140_softc[0].MDbase; 524 496 525 497 for (;;){ … … 529 501 RTEMS_NO_TIMEOUT, 530 502 &events); 531 rmd = dec21140_softc[0].MDbase;532 nbMD = 0;533 503 534 while (nbMD < NRXBUFS){ 535 if ( (rmd->status & 0x80000000) == 0){ 536 len = (rmd->status >> 16) & 0x7ff; 537 MGETHDR (m, M_WAIT, MT_DATA); 538 MCLGET (m, M_WAIT); 539 m->m_pkthdr.rcvif = ifp; 540 temp = m->m_data; 541 m->m_len = m->m_pkthdr.len = len - sizeof(struct ether_header); 542 memcpy(temp, (char *)rmd->buf1, len); 543 rmd->status = 0x80000000; 544 eh = mtod (m, struct ether_header *); 545 m->m_data += sizeof(struct ether_header); 546 ether_input (ifp, eh, m); 547 } 548 rmd++; 549 nbMD++; 504 while((rmd->status & 0x80000000) == 0){ 505 /* pass on the packet in the mbuf */ 506 len = (rmd->status >> 16) & 0x7ff; 507 m = (struct mbuf *)(rmd->m); 508 m->m_len = m->m_pkthdr.len = len - sizeof(struct ether_header); 509 eh = mtod (m, struct ether_header *); 510 m->m_data += sizeof(struct ether_header); 511 ether_input (ifp, eh, m); 512 513 /* get a new mbuf for the 21140 */ 514 MGETHDR (m, M_WAIT, MT_DATA); 515 MCLGET (m, M_WAIT); 516 m->m_pkthdr.rcvif = ifp; 517 rmd->m = m; 518 rmd->buf1 = phys_to_bus(mtod(m, void *)); 519 520 rmd->status = 0x80000000; 521 522 rmd=rmd->next; 550 523 } 551 *(tbase+memCSR7) = IT_SETUP;552 524 } 553 525 } … … 558 530 struct dec21140_softc *dp = ifp->if_softc; 559 531 volatile struct MD *tmd; 560 unsigned char *temp;532 volatile unsigned char *temp; 561 533 struct mbuf *n; 562 534 unsigned int len; 563 unsigned int *tbase;535 volatile unsigned int *tbase; 564 536 565 537 tbase = dp->base; 566 567 538 /* 568 539 * Waiting for Transmitter ready 569 540 */ 570 tmd = dec21140_softc[0].MDbase + NRXBUFS; 571 while ( (tmd->status & 0x80000000) != 0 ); 541 tmd = dec21140_softc[0].TxMD; 542 n = m; 543 544 while ((tmd->status & 0x80000000) != 0){ 545 tmd=tmd->next; 546 } 547 572 548 len = 0; 573 n = m; 574 temp = (char *)(tmd->buf1); 549 temp = (volatile unsigned char *)(bus_to_phys(tmd->buf1)); 575 550 576 551 for (;;){ 577 552 len += m->m_len; 578 memcpy( temp, (char *)m->m_data, m->m_len);553 memcpy((void*) temp, (char *)m->m_data, m->m_len); 579 554 temp += m->m_len ; 580 555 if ((m = m->m_next) == NULL) … … 583 558 584 559 if (len < ET_MINLEN) len = ET_MINLEN; 585 tmd->counts = 0xe2000000 | len;560 tmd->counts = 0xe1000000 | (len & 0x7ff); 586 561 tmd->status = 0x80000000; 587 562 588 *(tbase+memCSR1) = 0x1;563 st_le32( (tbase+memCSR1), 0x1); 589 564 590 565 m_freem(n); 566 dec21140_softc[0].TxMD = tmd->next; 591 567 } 592 568 … … 673 649 dec21140_stop (struct dec21140_softc *sc) 674 650 { 675 unsigned int *tbase;651 volatile unsigned int *tbase; 676 652 struct ifnet *ifp = &sc->arpcom.ac_if; 677 653 … … 682 658 */ 683 659 tbase=dec21140_softc[0].base ; 684 *(tbase+memCSR7) = NO_IT;685 *(tbase+memCSR6) = CSR6_INIT;686 free( sc->bufferBase);660 st_le32( (tbase+memCSR7), NO_IT); 661 st_le32( (tbase+memCSR6), CSR6_INIT); 662 free((void*)sc->bufferBase); 687 663 } 688 664 … … 760 736 break; 761 737 } 738 762 739 return error; 763 740 } … … 773 750 int mtu; 774 751 int i; 752 753 /* 754 * First, find a DEC board 755 */ 756 #if defined(__i386) 775 757 int signature; 776 758 int value; 777 759 char interrupt; 778 760 int diag; 779 780 /* 781 * Initialise PCI module 782 */ 761 783 762 if (pcib_init() == PCIB_ERR_NOTPRESENT) 784 763 rtems_panic("PCI BIOS not found !!"); … … 795 774 printk("DEC PCI Device found\n"); 796 775 } 776 #endif 777 #if defined(__PPC) 778 unsigned char ucSlotNumber, ucFnNumber; 779 unsigned int ulDeviceID, lvalue, tmp; 780 unsigned char cvalue; 781 782 for(ucSlotNumber=0;ucSlotNumber<PCI_MAX_DEVICES;ucSlotNumber++) { 783 for(ucFnNumber=0;ucFnNumber<PCI_MAX_FUNCTIONS;ucFnNumber++) { 784 (void)pci_read_config_dword(0, 785 ucSlotNumber, 786 ucFnNumber, 787 PCI_VENDOR_ID, 788 &ulDeviceID); 789 if(ulDeviceID==PCI_INVALID_VENDORDEVICEID) { 790 /* 791 * This slot is empty 792 */ 793 continue; 794 } 795 if (ulDeviceID == ((PCI_DEVICE_ID_DEC_TULIP_FAST<<16) + PCI_VENDOR_ID_DEC)) 796 break; 797 } 798 if (ulDeviceID == ((PCI_DEVICE_ID_DEC_TULIP_FAST<<16) + PCI_VENDOR_ID_DEC)){ 799 printk("DEC Adapter found !!\n"); 800 break; 801 } 802 } 797 803 804 if(ulDeviceID==PCI_INVALID_VENDORDEVICEID) 805 rtems_panic("DEC PCI board not found !!\n"); 806 #endif 798 807 /* 799 808 * Find a free driver … … 813 822 * Process options 814 823 */ 815 824 #if defined(__i386) 816 825 pcib_conf_read32(signature, 16, &value); 817 826 sc->port = value & ~IO_MASK; … … 828 837 pcib_conf_read8(signature, 60, &interrupt); 829 838 sc->irqInfo.name = (rtems_irq_symbolic_name)interrupt; 830 839 #endif 840 #if defined(__PPC) 841 (void)pci_read_config_dword(0, 842 ucSlotNumber, 843 ucFnNumber, 844 PCI_BASE_ADDRESS_0, 845 &lvalue); 846 847 sc->port = lvalue & (unsigned int)(~IO_MASK); 848 849 (void)pci_read_config_dword(0, 850 ucSlotNumber, 851 ucFnNumber, 852 PCI_BASE_ADDRESS_1 , 853 &lvalue); 854 855 856 tmp = (unsigned int)(lvalue & (unsigned int)(~MEM_MASK)) 857 + (unsigned int)PREP_ISA_MEM_BASE; 858 sc->base = (unsigned int *)(tmp); 859 860 (void)pci_read_config_byte(0, 861 ucSlotNumber, 862 ucFnNumber, 863 PCI_INTERRUPT_LINE, 864 &cvalue); 865 sc->irqInfo.name = (rtems_irq_symbolic_name)cvalue; 866 #endif 831 867 if (config->hardware_address) { 832 868 memcpy (sc->arpcom.ac_enaddr, config->hardware_address, … … 867 903 }; 868 904 869 870 871 872 873 874 875 876 877 878
Note: See TracChangeset
for help on using the changeset viewer.