X-Git-Url: https://git.kernelconcepts.de/?p=karo-tx-uboot.git;a=blobdiff_plain;f=doc%2FREADME.drivers.eth;h=1a9a23b51b92443e076da9468831ed3352f2b0cf;hp=eb83038b5dbd1880edc1e9f0cfa34f3ed6eb6a24;hb=ba651e1ab9a6079a444a54aac7f6ca08667199d0;hpb=e3f279fb1419b7cb5fd4d0e18e52a892770cf934 diff --git a/doc/README.drivers.eth b/doc/README.drivers.eth index eb83038b5d..1a9a23b51b 100644 --- a/doc/README.drivers.eth +++ b/doc/README.drivers.eth @@ -1,3 +1,9 @@ +!!! WARNING !!! + +This guide describes to the old way of doing things. No new Ethernet drivers +should be implemented this way. All new drivers should be written against the +U-Boot core driver model. See doc/driver-model/README.txt + ----------------------- Ethernet Driver Guide ----------------------- @@ -43,15 +49,16 @@ int ape_register(bd_t *bis, int iobase) { struct ape_priv *priv; struct eth_device *dev; + struct mii_dev *bus; priv = malloc(sizeof(*priv)); if (priv == NULL) - return 1; + return -ENOMEM; dev = malloc(sizeof(*dev)); if (dev == NULL) { free(priv); - return 1; + return -ENOMEM; } /* setup whatever private state you need */ @@ -59,7 +66,8 @@ int ape_register(bd_t *bis, int iobase) memset(dev, 0, sizeof(*dev)); sprintf(dev->name, "APE"); - /* if your device has dedicated hardware storage for the + /* + * if your device has dedicated hardware storage for the * MAC, read it and initialize dev->enetaddr with it */ ape_mac_read(dev->enetaddr); @@ -74,8 +82,17 @@ int ape_register(bd_t *bis, int iobase) eth_register(dev); -#ifdef CONFIG_CMD_MII) - miiphy_register(dev->name, ape_mii_read, ape_mii_write); +#ifdef CONFIG_PHYLIB + bus = mdio_alloc(); + if (!bus) { + free(priv); + free(dev); + return -ENOMEM; + } + + bus->read = ape_mii_read; + bus->write = ape_mii_write; + mdio_register(bus); #endif return 1; @@ -124,11 +141,11 @@ function can be called multiple times in a row. The recv function should process packets as long as the hardware has them readily available before returning. i.e. you should drain the hardware fifo. -For each packet you receive, you should call the NetReceive() function on it +For each packet you receive, you should call the net_process_received_packet() function on it along with the packet length. The common code sets up packet buffers for you -already in the .bss (NetRxPackets), so there should be no need to allocate your -own. This doesn't mean you must use the NetRxPackets array however; you're -free to call the NetReceive() function with any buffer you wish. So the pseudo +already in the .bss (net_rx_packets), so there should be no need to allocate your +own. This doesn't mean you must use the net_rx_packets array however; you're +free to call the net_process_received_packet() function with any buffer you wish. So the pseudo code here would look something like: int ape_recv(struct eth_device *dev) { @@ -136,9 +153,9 @@ int ape_recv(struct eth_device *dev) ... while (packets_are_available()) { ... - length = ape_get_packet(&NetRxPackets[i]); + length = ape_get_packet(&net_rx_packets[i]); ... - NetReceive(&NetRxPackets[i], length); + net_process_received_packet(&net_rx_packets[i], length); ... if (++i >= PKTBUFSRX) i = 0; @@ -166,25 +183,33 @@ some net operation (ping / tftp / whatever...) eth_halt() dev->halt() ------------------------------ - CONFIG_MII / CONFIG_CMD_MII ------------------------------ +-------------------------------- + CONFIG_PHYLIB / CONFIG_CMD_MII +-------------------------------- If your device supports banging arbitrary values on the MII bus (pretty much every device does), you should add support for the mii command. Doing so is fairly trivial and makes debugging mii issues a lot easier at runtime. After you have called eth_register() in your driver's register function, add -a call to miiphy_register() like so: -#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) - miiphy_register(dev->name, mii_read, mii_write); -#endif +a call to mdio_alloc() and mdio_register() like so: + bus = mdio_alloc(); + if (!bus) { + free(priv); + free(dev); + return -ENOMEM; + } + + bus->read = ape_mii_read; + bus->write = ape_mii_write; + mdio_register(bus); And then define the mii_read and mii_write functions if you haven't already. Their syntax is straightforward: - int mii_read(char *devname, uchar addr, uchar reg, ushort *val); - int mii_write(char *devname, uchar addr, uchar reg, ushort val); + int mii_read(struct mii_dev *bus, int addr, int devad, int reg); + int mii_write(struct mii_dev *bus, int addr, int devad, int reg, + u16 val); The read function should read the register 'reg' from the phy at address 'addr' -and store the result in the pointer 'val'. The implementation for the write -function should logically follow. +and return the result to its caller. The implementation for the write function +should logically follow.