Date: Tue, 8 Aug 2006 23:00:49 GMT From: Warner Losh <imp@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 103477 for review Message-ID: <200608082300.k78N0nfg062461@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=103477 Change 103477 by imp@imp_lighthouse on 2006/08/08 22:59:54 Reorder the way we initialize the NIC. Initialize more of the nic when we set the MAC address. For that matter, set the mac address only once correctly in the tftp case, rather than twice, the first time incorrectly. In the non-ftp case we were setting it once incorrectly :-(. This has the nice side effect of +100 bytes free. Affected files ... .. //depot/projects/arm/src/sys/boot/arm/at91/bootiic/loader_prompt.c#12 edit .. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.c#16 edit .. //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.c#22 edit .. //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.h#6 edit .. //depot/projects/arm/src/sys/boot/arm/at91/libat91/lib.h#15 edit Differences ... ==== //depot/projects/arm/src/sys/boot/arm/at91/bootiic/loader_prompt.c#12 (text+ko) ==== @@ -171,7 +171,7 @@ static void ParseCommand(char *buffer) { - int argc; + int argc, i; if ((argc = BreakCommand(buffer)) < 1) return; @@ -261,17 +261,12 @@ { // "m <mac address 12 34 56 78 9a bc> // set mac address using 6 byte values - unsigned low_addr, high_addr; + unsigned char mac[6]; if (argc > 6) { - low_addr = (p_ASCIIToHex(argv[4]) << 24) | - (p_ASCIIToHex(argv[3]) << 16) | - (p_ASCIIToHex(argv[2]) << 8) | - p_ASCIIToHex(argv[1]); - high_addr = - (p_ASCIIToHex(argv[6]) << 8) | - p_ASCIIToHex(argv[5]); - SetMACAddress(low_addr, high_addr); + for (i = 0; i < 6; i++) + mac[i] = p_ASCIIToHex(argv[i + 1]); + SetMACAddress(mac); } break; } ==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.c#16 (text+ko) ==== @@ -222,7 +222,7 @@ static void ParseCommand(char *buffer) { - int argc; + int argc, i; if ((argc = BreakCommand(buffer)) < 1) return; @@ -278,17 +278,12 @@ { // "m <mac address 12 34 56 78 9a bc> // set mac address using 6 byte values - unsigned low_addr, high_addr; + unsigned char mac[6]; if (argc > 6) { - low_addr = (p_ASCIIToHex(argv[4]) << 24) | - (p_ASCIIToHex(argv[3]) << 16) | - (p_ASCIIToHex(argv[2]) << 8) | - p_ASCIIToHex(argv[1]); - high_addr = - (p_ASCIIToHex(argv[6]) << 8) | - p_ASCIIToHex(argv[5]); - SetMACAddress(low_addr, high_addr); + for (i = 0; i < 6; i++) + mac[i] = p_ASCIIToHex(argv[i + 1]); + SetMACAddress(mac); } break; } ==== //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.c#22 (text+ko) ==== @@ -29,8 +29,9 @@ /* ********************** PRIVATE FUNCTIONS/DATA ******************************/ -static unsigned localMACSet, serverMACSet, MAC_init; +static unsigned localMACSet, serverMACSet; static unsigned char localMACAddr[6], serverMACAddr[6]; +static unsigned localMAClow, localMAChigh; static unsigned localIPSet, serverIPSet; static unsigned char localIPAddr[4], serverIPAddr[4]; static unsigned short serverPort, localPort; @@ -458,20 +459,9 @@ // Set the WRAP bit at the end of the list descriptor p_rxBD[MAX_RX_PACKETS-1].address |= 0x02; - pEmac->EMAC_CTL = 0; - - pEmac->EMAC_CFG = (pEmac->EMAC_CFG & ~(AT91C_EMAC_CLK)) | -#ifdef BOOT_TSC - AT91C_EMAC_RMII | -#endif - AT91C_EMAC_CLK_HCLK_32 | AT91C_EMAC_CAF; if (!(pEmac->EMAC_SR & AT91C_EMAC_LINK)) MII_GetLinkSpeed(pEmac); - // the sequence write EMAC_SA1L and write EMAC_SA1H must be respected - pEmac->EMAC_SA1L = ((unsigned)localMACAddr[2] << 24) | ((unsigned)localMACAddr[3] << 16) | ((int)localMACAddr[4] << 8) | localMACAddr[5]; - pEmac->EMAC_SA1H = ((unsigned)localMACAddr[0] << 8) | localMACAddr[1]; - pEmac->EMAC_RBQP = (unsigned) p_rxBD; pEmac->EMAC_RSR |= (AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA); pEmac->EMAC_CTL = AT91C_EMAC_TE | AT91C_EMAC_RE; @@ -491,58 +481,50 @@ * .KB_C_FN_DEFINITION_END */ void -SetMACAddress(unsigned low_address, unsigned high_address) +SetMACAddress(unsigned char mac[6]) { + AT91PS_PMC pPMC = AT91C_BASE_PMC; AT91PS_EMAC pEmac = AT91C_BASE_EMAC; - AT91PS_PMC pPMC = AT91C_BASE_PMC; /* enable the peripheral clock before using EMAC */ pPMC->PMC_PCER = ((unsigned) 1 << AT91C_ID_EMAC); - pEmac->EMAC_SA1L = low_address; - pEmac->EMAC_SA1H = (high_address & 0x0000ffff); - - localMACAddr[0] = (low_address >> 0) & 0xFF; - localMACAddr[1] = (low_address >> 8) & 0xFF; - localMACAddr[2] = (low_address >> 16) & 0xFF; - localMACAddr[3] = (low_address >> 24) & 0xFF; - localMACAddr[4] = (high_address >> 0) & 0xFF; - localMACAddr[5] = (high_address >> 8) & 0xFF; - + p_memcpy(localMACAddr, mac, 6); + localMAClow = (mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5]; + localMAChigh = (mac[0] << 8) | mac[1]; localMACSet = 1; - // low_address & 0x000000ff = first byte in address - // low_address & 0x0000ff00 = next - // low_address & 0x00ff0000 = next - // low_address & 0xff000000 = next - // high_address & 0x000000ff = next - // high_address & 0x0000ff00 = last byte in address - - if (!MAC_init) { - AT91C_BASE_PMC->PMC_PCER = 1u << AT91C_ID_EMAC; - AT91C_BASE_PIOA->PIO_ASR = - AT91C_PA14_ERXER | AT91C_PA12_ERX0 | AT91C_PA13_ERX1 | - AT91C_PA8_ETXEN | AT91C_PA16_EMDIO | AT91C_PA9_ETX0 | - AT91C_PA10_ETX1 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA15_EMDC | - AT91C_PA7_ETXCK_EREFCK; - AT91C_BASE_PIOA->PIO_PDR = - AT91C_PA14_ERXER | AT91C_PA12_ERX0 | AT91C_PA13_ERX1 | - AT91C_PA8_ETXEN | AT91C_PA16_EMDIO | AT91C_PA9_ETX0 | - AT91C_PA10_ETX1 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA15_EMDC | - AT91C_PA7_ETXCK_EREFCK; + AT91C_BASE_PMC->PMC_PCER = 1u << AT91C_ID_EMAC; + AT91C_BASE_PIOA->PIO_ASR = + AT91C_PA14_ERXER | AT91C_PA12_ERX0 | AT91C_PA13_ERX1 | + AT91C_PA8_ETXEN | AT91C_PA16_EMDIO | AT91C_PA9_ETX0 | + AT91C_PA10_ETX1 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA15_EMDC | + AT91C_PA7_ETXCK_EREFCK; + AT91C_BASE_PIOA->PIO_PDR = + AT91C_PA14_ERXER | AT91C_PA12_ERX0 | AT91C_PA13_ERX1 | + AT91C_PA8_ETXEN | AT91C_PA16_EMDIO | AT91C_PA9_ETX0 | + AT91C_PA10_ETX1 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA15_EMDC | + AT91C_PA7_ETXCK_EREFCK; #ifdef BOOT_KB9202 /* Really !RMII */ - AT91C_BASE_PIOB->PIO_BSR = - AT91C_PB12_ETX2 | AT91C_PB13_ETX3 | AT91C_PB14_ETXER | - AT91C_PB15_ERX2 | AT91C_PB16_ERX3 | AT91C_PB17_ERXDV | - AT91C_PB18_ECOL | AT91C_PB19_ERXCK; - AT91C_BASE_PIOB->PIO_PDR = - AT91C_PB12_ETX2 | AT91C_PB13_ETX3 | AT91C_PB14_ETXER | - AT91C_PB15_ERX2 | AT91C_PB16_ERX3 | AT91C_PB17_ERXDV | - AT91C_PB18_ECOL | AT91C_PB19_ERXCK; + AT91C_BASE_PIOB->PIO_BSR = + AT91C_PB12_ETX2 | AT91C_PB13_ETX3 | AT91C_PB14_ETXER | + AT91C_PB15_ERX2 | AT91C_PB16_ERX3 | AT91C_PB17_ERXDV | + AT91C_PB18_ECOL | AT91C_PB19_ERXCK; + AT91C_BASE_PIOB->PIO_PDR = + AT91C_PB12_ETX2 | AT91C_PB13_ETX3 | AT91C_PB14_ETXER | + AT91C_PB15_ERX2 | AT91C_PB16_ERX3 | AT91C_PB17_ERXDV | + AT91C_PB18_ECOL | AT91C_PB19_ERXCK; #endif - MAC_init = 1; - } + pEmac->EMAC_CTL = 0; + pEmac->EMAC_CFG = (pEmac->EMAC_CFG & ~(AT91C_EMAC_CLK)) | +#ifdef BOOT_TSC + AT91C_EMAC_RMII | +#endif + AT91C_EMAC_CLK_HCLK_32 | AT91C_EMAC_CAF; + // the sequence write EMAC_SA1L and write EMAC_SA1H must be respected + pEmac->EMAC_SA1L = localMAClow; + pEmac->EMAC_SA1H = localMAChigh; } @@ -607,7 +589,6 @@ return ; AT91F_EmacEntry(); - GetServerAddress(); dlAddress = (char*)address; lastSize = 0; @@ -659,5 +640,4 @@ serverIPSet = 0; localPort = SWAP16(0x8002); lastSize = 0; - MAC_init = 0; } ==== //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.h#6 (text+ko) ==== @@ -24,7 +24,7 @@ #ifndef _EMAC_H_ #define _EMAC_H_ -extern void SetMACAddress(unsigned low_address, unsigned high_address); +extern void SetMACAddress(unsigned char addr[6]); extern void SetServerIPAddress(unsigned address); extern void SetLocalIPAddress(unsigned address); extern void EMAC_Init(void); ==== //depot/projects/arm/src/sys/boot/arm/at91/libat91/lib.h#15 (text) ====
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608082300.k78N0nfg062461>