]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - include/net.h
dm: eth: Provide a way for drivers to manage packet buffers
[karo-tx-uboot.git] / include / net.h
index f434b9150344b0cd38dfc1d5306f929c6701aeb4..ef9de3cad14bce2844b4f4647e0b665ab832665d 100644 (file)
@@ -78,6 +78,70 @@ enum eth_state_t {
        ETH_STATE_ACTIVE
 };
 
+#ifdef CONFIG_DM_ETH
+/**
+ * struct eth_pdata - Platform data for Ethernet MAC controllers
+ *
+ * @iobase: The base address of the hardware registers
+ * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
+ */
+struct eth_pdata {
+       phys_addr_t iobase;
+       unsigned char enetaddr[6];
+};
+
+/**
+ * struct eth_ops - functions of Ethernet MAC controllers
+ *
+ * start: Prepare the hardware to send and receive packets
+ * send: Send the bytes passed in "packet" as a packet on the wire
+ * recv: Check if the hardware received a packet. If so, set the pointer to the
+ *      packet buffer in the packetp parameter. If not, return an error or 0 to
+ *      indicate that the hardware receive FIFO is empty. If 0 is returned, the
+ *      network stack will not process the empty packet, but free_pkt() will be
+ *      called if supplied
+ * free_pkt: Give the driver an opportunity to manage its packet buffer memory
+ *          when the network stack is finished processing it. This will only be
+ *          called when no error was returned from recv - optional
+ * stop: Stop the hardware from looking for packets - may be called even if
+ *      state == PASSIVE
+ * mcast: Join or leave a multicast group (for TFTP) - optional
+ * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
+ *              on some platforms like ARM). This function expects the
+ *              eth_pdata::enetaddr field to be populated - optional
+ * read_rom_hwaddr: Some devices have a backup of the MAC address stored in a
+ *                 ROM on the board. This is how the driver should expose it
+ *                 to the network stack. This function should fill in the
+ *                 eth_pdata::enetaddr field - optional
+ */
+struct eth_ops {
+       int (*start)(struct udevice *dev);
+       int (*send)(struct udevice *dev, void *packet, int length);
+       int (*recv)(struct udevice *dev, uchar **packetp);
+       int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
+       void (*stop)(struct udevice *dev);
+#ifdef CONFIG_MCAST_TFTP
+       int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
+#endif
+       int (*write_hwaddr)(struct udevice *dev);
+       int (*read_rom_hwaddr)(struct udevice *dev);
+};
+
+#define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
+
+struct udevice *eth_get_dev(void); /* get the current device */
+/*
+ * The devname can be either an exact name given by the driver or device tree
+ * or it can be an alias of the form "eth%d"
+ */
+struct udevice *eth_get_dev_by_name(const char *devname);
+unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
+/* Used only when NetConsole is enabled */
+int eth_init_state_only(void); /* Set active state */
+void eth_halt_state_only(void); /* Set passive state */
+#endif
+
+#ifndef CONFIG_DM_ETH
 struct eth_device {
        char name[16];
        unsigned char enetaddr[6];
@@ -119,7 +183,7 @@ static inline unsigned char *eth_get_ethaddr(void)
 }
 
 /* Set active state */
-static inline __attribute__((always_inline)) int eth_init_state_only(bd_t *bis)
+static inline __attribute__((always_inline)) int eth_init_state_only(void)
 {
        eth_get_dev()->state = ETH_STATE_ACTIVE;
 
@@ -144,8 +208,9 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
                     int eth_number);
 
 int usb_eth_initialize(bd_t *bi);
+#endif
 
-int eth_initialize(bd_t *bis); /* Initialize network subsystem */
+int eth_initialize(void);              /* Initialize network subsystem */
 void eth_try_another(int first_restart);       /* Change the device */
 void eth_set_current(void);            /* set nterface to ethcur var */
 
@@ -166,7 +231,7 @@ int eth_setenv_enetaddr(char *name, const uchar *enetaddr);
 int eth_getenv_enetaddr_by_index(const char *base_name, int index,
                                 uchar *enetaddr);
 
-int eth_init(bd_t *bis);                       /* Initialize the device */
+int eth_init(void);                    /* Initialize the device */
 int eth_send(void *packet, int length);           /* Send a packet */
 
 #ifdef CONFIG_API
@@ -416,7 +481,11 @@ extern uchar               NetServerEther[6];      /* Boot server enet address */
 extern IPaddr_t                NetOurIP;       /* Our    IP addr (0 = unknown) */
 extern IPaddr_t                NetServerIP;    /* Server IP addr (0 = unknown) */
 extern uchar           *NetTxPacket;           /* THE transmit packet */
+#ifdef CONFIG_DM_ETH
+extern uchar           *net_rx_packets[PKTBUFSRX]; /* Receive packets */
+#else
 extern uchar           *NetRxPackets[PKTBUFSRX]; /* Receive packets */
+#endif
 extern uchar           *NetRxPacket;           /* Current receive packet */
 extern int             NetRxPacketLen;         /* Current rx packet length */
 extern unsigned                NetIPID;                /* IP ID (counting) */
@@ -480,7 +549,7 @@ int NetLoop(enum proto_t);
 void   NetStop(void);
 
 /* Load failed.         Start again. */
-void   NetStartAgain(void);
+int    NetStartAgain(void);
 
 /* Get size of the ethernet header when we send */
 int    NetEthHdrSize(void);
@@ -550,6 +619,7 @@ static inline void net_set_state(enum net_loop_state state)
 /* Transmit a packet */
 static inline void NetSendPacket(uchar *pkt, int len)
 {
+       /* Currently no way to return errors from eth_send() */
        (void) eth_send(pkt, len);
 }
 
@@ -566,8 +636,11 @@ static inline void NetSendPacket(uchar *pkt, int len)
 int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport,
                        int sport, int payload_len);
 
+#ifndef CONFIG_DM_ETH
+#define NetReceive(in_packet, len) net_process_received_packet(in_packet, len)
+#endif
 /* Processes a received packet */
-void NetReceive(uchar *, int);
+void net_process_received_packet(uchar *in_packet, int len);
 
 #ifdef CONFIG_NETCONSOLE
 void NcStart(void);