sfc: Replace PHY MDIO test with an 'alive' test
[safe/jmp/linux-2.6] / drivers / net / sfc / net_driver.h
index fddf8f5..8f951e4 100644 (file)
@@ -1,7 +1,7 @@
 /****************************************************************************
  * Driver for Solarflare Solarstorm network controllers and boards
  * Copyright 2005-2006 Fen Systems Ltd.
- * Copyright 2005-2008 Solarflare Communications Inc.
+ * Copyright 2005-2009 Solarflare Communications Inc.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 as published
@@ -38,7 +38,7 @@
 #ifndef EFX_DRIVER_NAME
 #define EFX_DRIVER_NAME        "sfc"
 #endif
-#define EFX_DRIVER_VERSION     "2.3"
+#define EFX_DRIVER_VERSION     "3.0"
 
 #ifdef EFX_ENABLE_DEBUG
 #define EFX_BUG_ON_PARANOID(x) BUG_ON(x)
@@ -428,19 +428,6 @@ enum efx_int_mode {
 };
 #define EFX_INT_MODE_USE_MSI(x) (((x)->interrupt_mode) <= EFX_INT_MODE_MSI)
 
-enum phy_type {
-       PHY_TYPE_NONE = 0,
-       PHY_TYPE_TXC43128 = 1,
-       PHY_TYPE_88E1111 = 2,
-       PHY_TYPE_SFX7101 = 3,
-       PHY_TYPE_QT2022C2 = 4,
-       PHY_TYPE_PM8358 = 6,
-       PHY_TYPE_SFT9001A = 8,
-       PHY_TYPE_QT2025C = 9,
-       PHY_TYPE_SFT9001B = 10,
-       PHY_TYPE_MAX    /* Insert any new items before this */
-};
-
 #define EFX_IS10G(efx) ((efx)->link_state.speed == 10000)
 
 enum nic_state {
@@ -483,12 +470,6 @@ enum efx_fc_type {
        EFX_FC_AUTO = 4,
 };
 
-/* Supported MAC bit-mask */
-enum efx_mac_type {
-       EFX_GMAC = 1,
-       EFX_XMAC = 2,
-};
-
 /**
  * struct efx_link_state - Current state of the link
  * @up: Link is up
@@ -517,13 +498,15 @@ static inline bool efx_link_state_equal(const struct efx_link_state *left,
  * @check_fault: Check fault state. True if fault present.
  */
 struct efx_mac_operations {
-       void (*reconfigure) (struct efx_nic *efx);
+       int (*reconfigure) (struct efx_nic *efx);
        void (*update_stats) (struct efx_nic *efx);
        bool (*check_fault)(struct efx_nic *efx);
 };
 
 /**
  * struct efx_phy_operations - Efx PHY operations table
+ * @probe: Probe PHY and initialise efx->mdio.mode_support, efx->mdio.mmds,
+ *     efx->loopback_modes.
  * @init: Initialise PHY
  * @fini: Shut down PHY
  * @reconfigure: Reconfigure PHY (e.g. for new link parameters)
@@ -533,29 +516,26 @@ struct efx_mac_operations {
  * @set_settings: Set ethtool settings. Serialised by the mac_lock.
  * @set_npage_adv: Set abilities advertised in (Extended) Next Page
  *     (only needed where AN bit is set in mmds)
- * @num_tests: Number of PHY-specific tests/results
- * @test_names: Names of the tests/results
- * @run_tests: Run tests and record results as appropriate.
+ * @test_alive: Test that PHY is 'alive' (online)
+ * @test_name: Get the name of a PHY-specific test/result
+ * @run_tests: Run tests and record results as appropriate (offline).
  *     Flags are the ethtool tests flags.
- * @mmds: MMD presence mask
- * @loopbacks: Supported loopback modes mask
  */
 struct efx_phy_operations {
-       enum efx_mac_type macs;
+       int (*probe) (struct efx_nic *efx);
        int (*init) (struct efx_nic *efx);
        void (*fini) (struct efx_nic *efx);
-       void (*reconfigure) (struct efx_nic *efx);
+       void (*remove) (struct efx_nic *efx);
+       int (*reconfigure) (struct efx_nic *efx);
        bool (*poll) (struct efx_nic *efx);
        void (*get_settings) (struct efx_nic *efx,
                              struct ethtool_cmd *ecmd);
        int (*set_settings) (struct efx_nic *efx,
                             struct ethtool_cmd *ecmd);
        void (*set_npage_adv) (struct efx_nic *efx, u32);
-       u32 num_tests;
-       const char *const *test_names;
+       int (*test_alive) (struct efx_nic *efx);
+       const char *(*test_name) (struct efx_nic *efx, unsigned int index);
        int (*run_tests) (struct efx_nic *efx, int *results, unsigned flags);
-       int mmds;
-       unsigned loopbacks;
 };
 
 /**
@@ -697,10 +677,11 @@ union efx_multicast_hash {
  *     interrupt is handled.  It is used by falcon_test_interrupt()
  *     to verify that an interrupt has occurred.
  * @spi_flash: SPI flash device
- *     This field will be %NULL if no flash device is present.
+ *     This field will be %NULL if no flash device is present (or for Siena).
  * @spi_eeprom: SPI EEPROM device
- *     This field will be %NULL if no EEPROM device is present.
+ *     This field will be %NULL if no EEPROM device is present (or for Siena).
  * @spi_lock: SPI bus lock
+ * @mtd_list: List of MTDs attached to the NIC
  * @n_rx_nodesc_drop_cnt: RX no descriptor drop count
  * @nic_data: Hardware dependant state
  * @mac_lock: MAC access lock. Protects @port_enabled, @phy_mode,
@@ -728,8 +709,10 @@ union efx_multicast_hash {
  * @phy_op: PHY interface
  * @phy_data: PHY private data (including PHY-specific stats)
  * @mdio: PHY MDIO interface
+ * @mdio_bus: PHY MDIO bus ID (only used by Siena)
  * @phy_mode: PHY operating mode. Serialised by @mac_lock.
  * @xmac_poll_required: XMAC link state needs polling
+ * @link_advertising: Autonegotiation advertising flags
  * @link_state: Current state of the link
  * @n_link_state_changes: Number of times the link has changed state
  * @promiscuous: Promiscuous flag. Protected by netif_tx_lock.
@@ -777,14 +760,18 @@ struct efx_nic {
 
        struct efx_buffer irq_status;
        volatile signed int last_irq_cpu;
+       unsigned long irq_zero_count;
 
        struct efx_spi_device *spi_flash;
        struct efx_spi_device *spi_eeprom;
        struct mutex spi_lock;
+#ifdef CONFIG_SFC_MTD
+       struct list_head mtd_list;
+#endif
 
        unsigned n_rx_nodesc_drop_cnt;
 
-       struct falcon_nic_data *nic_data;
+       void *nic_data;
 
        struct mutex mac_lock;
        struct work_struct mac_work;
@@ -805,14 +792,16 @@ struct efx_nic {
        struct efx_mac_operations *mac_op;
        unsigned char mac_address[ETH_ALEN];
 
-       enum phy_type phy_type;
+       unsigned int phy_type;
        struct mutex mdio_lock;
        struct efx_phy_operations *phy_op;
        void *phy_data;
        struct mdio_if_info mdio;
+       unsigned int mdio_bus;
        enum efx_phy_mode phy_mode;
 
        bool xmac_poll_required;
+       u32 link_advertising;
        struct efx_link_state link_state;
        unsigned int n_link_state_changes;
 
@@ -822,7 +811,7 @@ struct efx_nic {
 
        atomic_t rx_reset;
        enum efx_loopback_mode loopback_mode;
-       unsigned int loopback_modes;
+       u64 loopback_modes;
 
        void *loopback_selftest;
 };
@@ -841,8 +830,35 @@ static inline const char *efx_dev_name(struct efx_nic *efx)
        return efx_dev_registered(efx) ? efx->name : "";
 }
 
+static inline unsigned int efx_port_num(struct efx_nic *efx)
+{
+       return PCI_FUNC(efx->pci_dev->devfn);
+}
+
 /**
  * struct efx_nic_type - Efx device type definition
+ * @probe: Probe the controller
+ * @remove: Free resources allocated by probe()
+ * @init: Initialise the controller
+ * @fini: Shut down the controller
+ * @monitor: Periodic function for polling link state and hardware monitor
+ * @reset: Reset the controller hardware and possibly the PHY.  This will
+ *     be called while the controller is uninitialised.
+ * @probe_port: Probe the MAC and PHY
+ * @remove_port: Free resources allocated by probe_port()
+ * @prepare_flush: Prepare the hardware for flushing the DMA queues
+ * @update_stats: Update statistics not provided by event handling
+ * @start_stats: Start the regular fetching of statistics
+ * @stop_stats: Stop the regular fetching of statistics
+ * @set_id_led: Set state of identifying LED or revert to automatic function
+ * @push_irq_moderation: Apply interrupt moderation value
+ * @push_multicast_hash: Apply multicast hash table
+ * @reconfigure_port: Push loopback/power/txdis changes to the MAC and PHY
+ * @get_wol: Get WoL configuration from driver state
+ * @set_wol: Push WoL configuration to the NIC
+ * @resume_wol: Synchronise WoL state between driver and MC (e.g. after resume)
+ * @test_registers: Test read/write functionality of control registers
+ * @test_nvram: Test validity of NVRAM contents
  * @default_mac_ops: efx_mac_operations to set at startup
  * @revision: Hardware architecture revision
  * @mem_map_size: Memory BAR mapped size
@@ -859,8 +875,33 @@ static inline const char *efx_dev_name(struct efx_nic *efx)
  *     descriptors
  * @tx_dc_base: Base address in SRAM of TX queue descriptor caches
  * @rx_dc_base: Base address in SRAM of RX queue descriptor caches
+ * @offload_features: net_device feature flags for protocol offload
+ *     features implemented in hardware
+ * @reset_world_flags: Flags for additional components covered by
+ *     reset method RESET_TYPE_WORLD
  */
 struct efx_nic_type {
+       int (*probe)(struct efx_nic *efx);
+       void (*remove)(struct efx_nic *efx);
+       int (*init)(struct efx_nic *efx);
+       void (*fini)(struct efx_nic *efx);
+       void (*monitor)(struct efx_nic *efx);
+       int (*reset)(struct efx_nic *efx, enum reset_type method);
+       int (*probe_port)(struct efx_nic *efx);
+       void (*remove_port)(struct efx_nic *efx);
+       void (*prepare_flush)(struct efx_nic *efx);
+       void (*update_stats)(struct efx_nic *efx);
+       void (*start_stats)(struct efx_nic *efx);
+       void (*stop_stats)(struct efx_nic *efx);
+       void (*set_id_led)(struct efx_nic *efx, enum efx_led_mode mode);
+       void (*push_irq_moderation)(struct efx_channel *channel);
+       void (*push_multicast_hash)(struct efx_nic *efx);
+       int (*reconfigure_port)(struct efx_nic *efx);
+       void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
+       int (*set_wol)(struct efx_nic *efx, u32 type);
+       void (*resume_wol)(struct efx_nic *efx);
+       int (*test_registers)(struct efx_nic *efx);
+       int (*test_nvram)(struct efx_nic *efx);
        struct efx_mac_operations *default_mac_ops;
 
        int revision;
@@ -876,6 +917,8 @@ struct efx_nic_type {
        unsigned int phys_addr_channels;
        unsigned int tx_dc_base;
        unsigned int rx_dc_base;
+       unsigned long offload_features;
+       u32 reset_world_flags;
 };
 
 /**************************************************************************