apalis_imx6: unify sd/mmc drive strength with linux kernel settings
[oweals/u-boot.git] / include / net.h
index 5ee5929beb8626dab694e838e8735324e17062f8..44b32385c402e5697fec20ad9a820d0435773c39 100644 (file)
@@ -1,9 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *     LiMon Monitor (LiMon) - Network.
  *
  *     Copyright 1994 - 2000 Neil Russell.
  *     (See License)
- *     SPDX-License-Identifier:        GPL-2.0
  *
  * History
  *     9/16/00   bor  adapted to TQM823L/STK8xxL board, RARP/TFTP boot added
 #ifndef __NET_H__
 #define __NET_H__
 
-#if defined(CONFIG_8xx)
-#include <commproc.h>
-#endif /* CONFIG_8xx */
-
 #include <asm/cache.h>
 #include <asm/byteorder.h>     /* for nton* / ntoh* stuff */
+#include <linux/if_ether.h>
 
 #define DEBUG_LL_STATE 0       /* Link local state machine changes */
 #define DEBUG_DEV_PKT 0                /* Packets or info directed to the device */
 
 #define PKTALIGN       ARCH_DMA_MINALIGN
 
+/* ARP hardware address length */
+#define ARP_HLEN 6
+/*
+ * The size of a MAC address in string form, each digit requires two chars
+ * and five separator characters to form '00:00:00:00:00:00'.
+ */
+#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
+
 /* IPv4 addresses are always 32 bits in size */
 struct in_addr {
        __be32 s_addr;
@@ -87,12 +92,14 @@ enum eth_state_t {
  * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
  * @phy_interface: PHY interface to use - see PHY_INTERFACE_MODE_...
  * @max_speed: Maximum speed of Ethernet connection supported by MAC
+ * @priv_pdata: device specific platdata
  */
 struct eth_pdata {
        phys_addr_t iobase;
-       unsigned char enetaddr[6];
+       unsigned char enetaddr[ARP_HLEN];
        int phy_interface;
        int max_speed;
+       void *priv_pdata;
 };
 
 enum eth_recv_flags {
@@ -135,9 +142,7 @@ struct eth_ops {
        int (*recv)(struct udevice *dev, int flags, 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);
 };
@@ -160,8 +165,9 @@ void eth_halt_state_only(void); /* Set passive state */
 
 #ifndef CONFIG_DM_ETH
 struct eth_device {
-       char name[16];
-       unsigned char enetaddr[6];
+#define ETH_NAME_LEN 20
+       char name[ETH_NAME_LEN];
+       unsigned char enetaddr[ARP_HLEN];
        phys_addr_t iobase;
        int state;
 
@@ -169,9 +175,7 @@ struct eth_device {
        int (*send)(struct eth_device *, void *packet, int length);
        int (*recv)(struct eth_device *);
        void (*halt)(struct eth_device *);
-#ifdef CONFIG_MCAST_TFTP
-       int (*mcast)(struct eth_device *, const u8 *enetaddr, u8 set);
-#endif
+       int (*mcast)(struct eth_device *, const u8 *enetaddr, int join);
        int (*write_hwaddr)(struct eth_device *);
        struct eth_device *next;
        int index;
@@ -233,12 +237,9 @@ void eth_try_another(int first_restart);   /* Change the device */
 void eth_set_current(void);            /* set nterface to ethcur var */
 
 int eth_get_dev_index(void);           /* get the device index */
-void eth_parse_enetaddr(const char *addr, uchar *enetaddr);
-int eth_getenv_enetaddr(const char *name, uchar *enetaddr);
-int eth_setenv_enetaddr(const char *name, const uchar *enetaddr);
 
 /**
- * eth_setenv_enetaddr_by_index() - set the MAC address envrionment variable
+ * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
  *
  * This sets up an environment variable with the given MAC address (@enetaddr).
  * The environment variable to be set is defined by <@base_name><@index>addr.
@@ -250,10 +251,17 @@ int eth_setenv_enetaddr(const char *name, const uchar *enetaddr);
  * @enetaddr:   Pointer to MAC address to put into the variable
  * @return 0 if OK, other value on error
  */
-int eth_setenv_enetaddr_by_index(const char *base_name, int index,
+int eth_env_set_enetaddr_by_index(const char *base_name, int index,
                                 uchar *enetaddr);
 
 
+/*
+ * Initialize USB ethernet device with CONFIG_DM_ETH
+ * Returns:
+ *     0 is success, non-zero is error status.
+ */
+int usb_ether_init(void);
+
 /*
  * Get the hardware address for an ethernet interface .
  * Args:
@@ -263,7 +271,7 @@ int eth_setenv_enetaddr_by_index(const char *base_name, int index,
  * Returns:
  *     Return true if the address is valid.
  */
-int eth_getenv_enetaddr_by_index(const char *base_name, int index,
+int eth_env_get_enetaddr_by_index(const char *base_name, int index,
                                 uchar *enetaddr);
 
 int eth_init(void);                    /* Initialize the device */
@@ -276,12 +284,7 @@ extern void (*push_packet)(void *packet, int length);
 int eth_rx(void);                      /* Check for received packets */
 void eth_halt(void);                   /* stop SCC */
 const char *eth_get_name(void);                /* get name of current device */
-
-#ifdef CONFIG_MCAST_TFTP
 int eth_mcast_join(struct in_addr mcast_addr, int join);
-u32 ether_crc(size_t len, unsigned char const *p);
-#endif
-
 
 /**********************************************************************/
 /*
@@ -293,10 +296,10 @@ u32 ether_crc(size_t len, unsigned char const *p);
  */
 
 struct ethernet_hdr {
-       u8              et_dest[6];     /* Destination node             */
-       u8              et_src[6];      /* Source node                  */
-       u16             et_protlen;     /* Protocol or length           */
-};
+       u8              et_dest[ARP_HLEN];      /* Destination node     */
+       u8              et_src[ARP_HLEN];       /* Source node          */
+       u16             et_protlen;             /* Protocol or length   */
+} __attribute__((packed));
 
 /* Ethernet header size */
 #define ETHER_HDR_SIZE (sizeof(struct ethernet_hdr))
@@ -304,17 +307,17 @@ struct ethernet_hdr {
 #define ETH_FCS_LEN    4               /* Octets in the FCS            */
 
 struct e802_hdr {
-       u8              et_dest[6];     /* Destination node             */
-       u8              et_src[6];      /* Source node                  */
-       u16             et_protlen;     /* Protocol or length           */
-       u8              et_dsap;        /* 802 DSAP                     */
-       u8              et_ssap;        /* 802 SSAP                     */
-       u8              et_ctl;         /* 802 control                  */
-       u8              et_snap1;       /* SNAP                         */
+       u8              et_dest[ARP_HLEN];      /* Destination node     */
+       u8              et_src[ARP_HLEN];       /* Source node          */
+       u16             et_protlen;             /* Protocol or length   */
+       u8              et_dsap;                /* 802 DSAP             */
+       u8              et_ssap;                /* 802 SSAP             */
+       u8              et_ctl;                 /* 802 control          */
+       u8              et_snap1;               /* SNAP                 */
        u8              et_snap2;
        u8              et_snap3;
-       u16             et_prot;        /* 802 protocol                 */
-};
+       u16             et_prot;                /* 802 protocol         */
+} __attribute__((packed));
 
 /* 802 + SNAP + ethernet header size */
 #define E802_HDR_SIZE  (sizeof(struct e802_hdr))
@@ -323,18 +326,19 @@ struct e802_hdr {
  *     Virtual LAN Ethernet header
  */
 struct vlan_ethernet_hdr {
-       u8              vet_dest[6];    /* Destination node             */
-       u8              vet_src[6];     /* Source node                  */
-       u16             vet_vlan_type;  /* PROT_VLAN                    */
-       u16             vet_tag;        /* TAG of VLAN                  */
-       u16             vet_type;       /* protocol type                */
-};
+       u8              vet_dest[ARP_HLEN];     /* Destination node     */
+       u8              vet_src[ARP_HLEN];      /* Source node          */
+       u16             vet_vlan_type;          /* PROT_VLAN            */
+       u16             vet_tag;                /* TAG of VLAN          */
+       u16             vet_type;               /* protocol type        */
+} __attribute__((packed));
 
 /* VLAN Ethernet header size */
 #define VLAN_ETHER_HDR_SIZE    (sizeof(struct vlan_ethernet_hdr))
 
 #define PROT_IP                0x0800          /* IP protocol                  */
 #define PROT_ARP       0x0806          /* IP ARP protocol              */
+#define PROT_WOL       0x0842          /* ether-wake WoL protocol      */
 #define PROT_RARP      0x8035          /* IP ARP protocol              */
 #define PROT_VLAN      0x8100          /* IEEE 802.1q protocol         */
 #define PROT_IPV6      0x86dd          /* IPv6 over bluebook           */
@@ -357,7 +361,7 @@ struct ip_hdr {
        u16             ip_sum;         /* checksum                     */
        struct in_addr  ip_src;         /* Source IP address            */
        struct in_addr  ip_dst;         /* Destination IP address       */
-};
+} __attribute__((packed));
 
 #define IP_OFFS                0x1fff /* ip offset *= 8 */
 #define IP_FLAGS       0xe000 /* first 3 bits */
@@ -385,7 +389,7 @@ struct ip_udp_hdr {
        u16             udp_dst;        /* UDP destination port         */
        u16             udp_len;        /* Length of UDP packet         */
        u16             udp_xsum;       /* Checksum                     */
-};
+} __attribute__((packed));
 
 #define IP_UDP_HDR_SIZE                (sizeof(struct ip_udp_hdr))
 #define UDP_HDR_SIZE           (IP_UDP_HDR_SIZE - IP_HDR_SIZE)
@@ -398,7 +402,6 @@ struct arp_hdr {
 #   define ARP_ETHER       1           /* Ethernet  hardware address   */
        u16             ar_pro;         /* Format of protocol address   */
        u8              ar_hln;         /* Length of hardware address   */
-#   define ARP_HLEN    6
        u8              ar_pln;         /* Length of protocol address   */
 #   define ARP_PLEN    4
        u16             ar_op;          /* Operation                    */
@@ -424,7 +427,7 @@ struct arp_hdr {
        u8              ar_tha[];       /* Target hardware address      */
        u8              ar_tpa[];       /* Target protocol address      */
 #endif /* 0 */
-};
+} __attribute__((packed));
 
 #define ARP_HDR_SIZE   (8+20)          /* Size assuming ethernet       */
 
@@ -459,7 +462,7 @@ struct icmp_hdr {
                } frag;
                u8 data[0];
        } un;
-};
+} __attribute__((packed));
 
 #define ICMP_HDR_SIZE          (sizeof(struct icmp_hdr))
 #define IP_ICMP_HDR_SIZE       (IP_HDR_SIZE + ICMP_HDR_SIZE)
@@ -507,16 +510,16 @@ extern char       net_nis_domain[32];     /* Our IS domain */
 extern char    net_hostname[32];       /* Our hostname */
 extern char    net_root_path[64];      /* Our root path */
 /** END OF BOOTP EXTENTIONS **/
-extern u8              net_ethaddr[6];         /* Our ethernet address */
-extern u8              net_server_ethaddr[6];  /* Boot server enet address */
+extern u8              net_ethaddr[ARP_HLEN];          /* Our ethernet address */
+extern u8              net_server_ethaddr[ARP_HLEN];   /* Boot server enet address */
 extern struct in_addr  net_ip;         /* Our    IP addr (0 = unknown) */
 extern struct in_addr  net_server_ip;  /* Server IP addr (0 = unknown) */
 extern uchar           *net_tx_packet;         /* THE transmit packet */
 extern uchar           *net_rx_packets[PKTBUFSRX]; /* Receive packets */
 extern uchar           *net_rx_packet;         /* Current receive packet */
 extern int             net_rx_packet_len;      /* Current rx packet length */
-extern const u8                net_bcast_ethaddr[6];   /* Ethernet broadcast address */
-extern const u8                net_null_ethaddr[6];
+extern const u8                net_bcast_ethaddr[ARP_HLEN];    /* Ethernet broadcast address */
+extern const u8                net_null_ethaddr[ARP_HLEN];
 
 #define VLAN_NONE      4095                    /* untagged */
 #define VLAN_IDMASK    0x0fff                  /* mask of valid vlan id */
@@ -527,10 +530,12 @@ extern int                net_restart_wrap;       /* Tried all network devices */
 
 enum proto_t {
        BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP,
-       TFTPSRV, TFTPPUT, LINKLOCAL
+       TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT, WOL
 };
 
 extern char    net_boot_file_name[1024];/* Boot File name */
+/* Indicates whether the file name was specified on the command line */
+extern bool    net_boot_file_name_explicit;
 /* The actual transferred size of the bootfile (in bytes) */
 extern u32     net_boot_file_size;
 /* Boot file size in blocks as reported by the DHCP server */
@@ -555,9 +560,9 @@ extern ushort cdp_appliance_vlan;   /* CDP returned appliance VLAN */
  */
 static inline int is_cdp_packet(const uchar *ethaddr)
 {
-       extern const u8 net_cdp_ethaddr[6];
+       extern const u8 net_cdp_ethaddr[ARP_HLEN];
 
-       return memcmp(ethaddr, net_cdp_ethaddr, 6) == 0;
+       return memcmp(ethaddr, net_cdp_ethaddr, ARP_HLEN) == 0;
 }
 #endif
 
@@ -566,10 +571,6 @@ extern struct in_addr      net_ntp_server;         /* the ip address to NTP */
 extern int net_ntp_time_offset;                        /* offset time from UTC */
 #endif
 
-#if defined(CONFIG_MCAST_TFTP)
-extern struct in_addr net_mcast_addr;
-#endif
-
 /* Initialize the network adapter */
 void net_init(void);
 int net_loop(enum proto_t);
@@ -585,7 +586,8 @@ int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
 int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
 
 /* Set IP header */
-void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source);
+void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
+                      u16 pkt_len, u8 proto);
 void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
                                int sport, int len);
 
@@ -624,6 +626,7 @@ rxhand_f *net_get_udp_handler(void);        /* Get UDP RX packet handler */
 void net_set_udp_handler(rxhand_f *);  /* Set UDP RX packet handler */
 rxhand_f *net_get_arp_handler(void);   /* Get ARP RX packet handler */
 void net_set_arp_handler(rxhand_f *);  /* Set ARP RX packet handler */
+bool arp_is_waiting(void);             /* Waiting for ARP reply? */
 void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
 void net_set_timeout_handler(ulong, thand_f *);/* Set timeout handler */
 
@@ -642,6 +645,14 @@ static inline void net_set_state(enum net_loop_state state)
        net_state = state;
 }
 
+/*
+ * net_get_async_tx_pkt_buf - Get a packet buffer that is not in use for
+ *                           sending an asynchronous reply
+ *
+ * returns - ptr to packet buffer
+ */
+uchar * net_get_async_tx_pkt_buf(void);
+
 /* Transmit a packet */
 static inline void net_send_packet(uchar *pkt, int len)
 {
@@ -659,13 +670,16 @@ static inline void net_send_packet(uchar *pkt, int len)
  * @param sport Source UDP port
  * @param payload_len Length of data after the UDP header
  */
+int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
+                      int payload_len, int proto, u8 action, u32 tcp_seq_num,
+                      u32 tcp_ack_num);
 int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
                        int sport, int payload_len);
 
 /* Processes a received packet */
 void net_process_received_packet(uchar *in_packet, int len);
 
-#ifdef CONFIG_NETCONSOLE
+#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
 void nc_start(void);
 int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
        unsigned src_port, unsigned len);
@@ -673,7 +687,7 @@ int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
 
 static __always_inline int eth_is_on_demand_init(void)
 {
-#ifdef CONFIG_NETCONSOLE
+#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
        extern enum proto_t net_loop_last_protocol;
 
        return net_loop_last_protocol != NETCONS;
@@ -684,7 +698,7 @@ static __always_inline int eth_is_on_demand_init(void)
 
 static inline void eth_set_last_protocol(int protocol)
 {
-#ifdef CONFIG_NETCONSOLE
+#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
        extern enum proto_t net_loop_last_protocol;
 
        net_loop_last_protocol = protocol;
@@ -823,11 +837,25 @@ void vlan_to_string(ushort x, char *s);
 ushort string_to_vlan(const char *s);
 
 /* read a VLAN id from an environment variable */
-ushort getenv_vlan(char *);
+ushort env_get_vlan(char *);
 
 /* copy a filename (allow for "..." notation, limit length) */
 void copy_filename(char *dst, const char *src, int size);
 
+/* check if serverip is specified in filename from the command line */
+int is_serverip_in_cmd(void);
+
+/**
+ * net_parse_bootfile - Parse the bootfile env var / cmd line param
+ *
+ * @param ipaddr - a pointer to the ipaddr to populate if included in bootfile
+ * @param filename - a pointer to the string to save the filename part
+ * @param max_len - The longest - 1 that the filename part can be
+ *
+ * return 1 if parsed, 0 if bootfile is empty
+ */
+int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len);
+
 /* get a random source port */
 unsigned int random_port(void);