diff options
author | Mithlesh Thukral <mithlesh@netxen.com> | 2007-04-20 10:52:37 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-04-28 11:01:05 -0400 |
commit | 3176ff3ee71bddbd1d68e6a9e28dbcf0a2960c95 (patch) | |
tree | 260ba783bbd24bf21f17c11f9a6f06a7c50a9fc6 /drivers/net/netxen/netxen_nic.h | |
parent | d52df4a35af569071fda3f4eb08e47cc7023f094 (diff) |
NetXen: Use multiple PCI functions
NetXen: Make driver use multiple PCI functions.
This patch will make NetXen driver work with multiple PCI functions. This will
make the usage of memory resources as well as interrupts more independent
among different functions which results in better throughput. This change has
been done after the multiport support is added in firmware.
Signed-off by: Mithlesh Thukral <mithlesh@netxen.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/netxen/netxen_nic.h')
-rw-r--r-- | drivers/net/netxen/netxen_nic.h | 125 |
1 files changed, 53 insertions, 72 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index dd8ce35332fe..b996cb38ecb5 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -230,7 +230,9 @@ enum { | |||
230 | (((index) + (count)) & ((length) - 1)) | 230 | (((index) + (count)) & ((length) - 1)) |
231 | 231 | ||
232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 | 232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 |
233 | #define MPORT_MULTI_FUNCTION_MODE 0x2222 | ||
233 | 234 | ||
235 | #include "netxen_nic_phan_reg.h" | ||
234 | extern unsigned long long netxen_dma_mask; | 236 | extern unsigned long long netxen_dma_mask; |
235 | extern unsigned long last_schedule_time; | 237 | extern unsigned long last_schedule_time; |
236 | 238 | ||
@@ -703,10 +705,8 @@ extern char netxen_nic_driver_name[]; | |||
703 | #else | 705 | #else |
704 | #define DPRINTK(klevel, fmt, args...) do { \ | 706 | #define DPRINTK(klevel, fmt, args...) do { \ |
705 | printk(KERN_##klevel PFX "%s: %s: " fmt, __FUNCTION__,\ | 707 | printk(KERN_##klevel PFX "%s: %s: " fmt, __FUNCTION__,\ |
706 | (adapter != NULL && \ | 708 | (adapter != NULL && adapter->netdev != NULL) ? \ |
707 | adapter->port[0] != NULL && \ | 709 | adapter->netdev->name : NULL, \ |
708 | adapter->port[0]->netdev != NULL) ? \ | ||
709 | adapter->port[0]->netdev->name : NULL, \ | ||
710 | ## args); } while(0) | 710 | ## args); } while(0) |
711 | #endif | 711 | #endif |
712 | 712 | ||
@@ -788,17 +788,27 @@ struct netxen_hardware_context { | |||
788 | #define ETHERNET_FCS_SIZE 4 | 788 | #define ETHERNET_FCS_SIZE 4 |
789 | 789 | ||
790 | struct netxen_adapter_stats { | 790 | struct netxen_adapter_stats { |
791 | u64 ints; | 791 | u64 rcvdbadskb; |
792 | u64 hostints; | 792 | u64 xmitcalled; |
793 | u64 otherints; | 793 | u64 xmitedframes; |
794 | u64 process_rcv; | 794 | u64 xmitfinished; |
795 | u64 process_xmit; | 795 | u64 badskblen; |
796 | u64 noxmitdone; | 796 | u64 nocmddescriptor; |
797 | u64 xmitcsummed; | 797 | u64 polled; |
798 | u64 post_called; | 798 | u64 uphappy; |
799 | u64 posted; | 799 | u64 updropped; |
800 | u64 lastposted; | 800 | u64 uplcong; |
801 | u64 goodskbposts; | 801 | u64 uphcong; |
802 | u64 upmcong; | ||
803 | u64 updunno; | ||
804 | u64 skbfreed; | ||
805 | u64 txdropped; | ||
806 | u64 txnullskb; | ||
807 | u64 csummed; | ||
808 | u64 no_rcv; | ||
809 | u64 rxbytes; | ||
810 | u64 txbytes; | ||
811 | u64 ints; | ||
802 | }; | 812 | }; |
803 | 813 | ||
804 | /* | 814 | /* |
@@ -846,13 +856,19 @@ struct netxen_dummy_dma { | |||
846 | 856 | ||
847 | struct netxen_adapter { | 857 | struct netxen_adapter { |
848 | struct netxen_hardware_context ahw; | 858 | struct netxen_hardware_context ahw; |
849 | int port_count; /* Number of configured ports */ | 859 | |
850 | int active_ports; /* Number of open ports */ | 860 | struct netxen_adapter *master; |
851 | struct netxen_port *port[NETXEN_MAX_PORTS]; /* ptr to each port */ | 861 | struct net_device *netdev; |
862 | struct pci_dev *pdev; | ||
863 | unsigned char mac_addr[ETH_ALEN]; | ||
864 | int mtu; | ||
865 | int portnum; | ||
866 | |||
852 | spinlock_t tx_lock; | 867 | spinlock_t tx_lock; |
853 | spinlock_t lock; | 868 | spinlock_t lock; |
854 | struct work_struct watchdog_task; | 869 | struct work_struct watchdog_task; |
855 | struct timer_list watchdog_timer; | 870 | struct timer_list watchdog_timer; |
871 | struct work_struct tx_timeout_task; | ||
856 | 872 | ||
857 | u32 curr_window; | 873 | u32 curr_window; |
858 | 874 | ||
@@ -875,6 +891,15 @@ struct netxen_adapter { | |||
875 | u32 temp; | 891 | u32 temp; |
876 | 892 | ||
877 | struct netxen_adapter_stats stats; | 893 | struct netxen_adapter_stats stats; |
894 | |||
895 | u16 portno; | ||
896 | u16 link_speed; | ||
897 | u16 link_duplex; | ||
898 | u16 state; | ||
899 | u16 link_autoneg; | ||
900 | int rcsum; | ||
901 | int status; | ||
902 | spinlock_t stats_lock; | ||
878 | 903 | ||
879 | struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */ | 904 | struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */ |
880 | 905 | ||
@@ -894,62 +919,20 @@ struct netxen_adapter { | |||
894 | int (*enable_phy_interrupts) (struct netxen_adapter *, int); | 919 | int (*enable_phy_interrupts) (struct netxen_adapter *, int); |
895 | int (*disable_phy_interrupts) (struct netxen_adapter *, int); | 920 | int (*disable_phy_interrupts) (struct netxen_adapter *, int); |
896 | void (*handle_phy_intr) (struct netxen_adapter *); | 921 | void (*handle_phy_intr) (struct netxen_adapter *); |
897 | int (*macaddr_set) (struct netxen_port *, netxen_ethernet_macaddr_t); | 922 | int (*macaddr_set) (struct netxen_adapter *, netxen_ethernet_macaddr_t); |
898 | int (*set_mtu) (struct netxen_port *, int); | 923 | int (*set_mtu) (struct netxen_adapter *, int); |
899 | int (*set_promisc) (struct netxen_adapter *, int, | 924 | int (*set_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t); |
900 | netxen_niu_prom_mode_t); | 925 | int (*unset_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t); |
901 | int (*unset_promisc) (struct netxen_adapter *, int, | ||
902 | netxen_niu_prom_mode_t); | ||
903 | int (*phy_read) (struct netxen_adapter *, long phy, long reg, u32 *); | 926 | int (*phy_read) (struct netxen_adapter *, long phy, long reg, u32 *); |
904 | int (*phy_write) (struct netxen_adapter *, long phy, long reg, u32 val); | 927 | int (*phy_write) (struct netxen_adapter *, long phy, long reg, u32 val); |
905 | int (*init_port) (struct netxen_adapter *, int); | 928 | int (*init_port) (struct netxen_adapter *, int); |
906 | void (*init_niu) (struct netxen_adapter *); | 929 | void (*init_niu) (struct netxen_adapter *); |
907 | int (*stop_port) (struct netxen_adapter *, int); | 930 | int (*stop_port) (struct netxen_adapter *); |
908 | }; /* netxen_adapter structure */ | 931 | }; /* netxen_adapter structure */ |
909 | 932 | ||
910 | /* Max number of xmit producer threads that can run simultaneously */ | 933 | /* Max number of xmit producer threads that can run simultaneously */ |
911 | #define MAX_XMIT_PRODUCERS 16 | 934 | #define MAX_XMIT_PRODUCERS 16 |
912 | 935 | ||
913 | struct netxen_port_stats { | ||
914 | u64 rcvdbadskb; | ||
915 | u64 xmitcalled; | ||
916 | u64 xmitedframes; | ||
917 | u64 xmitfinished; | ||
918 | u64 badskblen; | ||
919 | u64 nocmddescriptor; | ||
920 | u64 polled; | ||
921 | u64 uphappy; | ||
922 | u64 updropped; | ||
923 | u64 uplcong; | ||
924 | u64 uphcong; | ||
925 | u64 upmcong; | ||
926 | u64 updunno; | ||
927 | u64 skbfreed; | ||
928 | u64 txdropped; | ||
929 | u64 txnullskb; | ||
930 | u64 csummed; | ||
931 | u64 no_rcv; | ||
932 | u64 rxbytes; | ||
933 | u64 txbytes; | ||
934 | }; | ||
935 | |||
936 | struct netxen_port { | ||
937 | struct netxen_adapter *adapter; | ||
938 | |||
939 | u16 portnum; /* GBE port number */ | ||
940 | u16 link_speed; | ||
941 | u16 link_duplex; | ||
942 | u16 link_autoneg; | ||
943 | |||
944 | int flags; | ||
945 | |||
946 | struct net_device *netdev; | ||
947 | struct pci_dev *pdev; | ||
948 | struct net_device_stats net_stats; | ||
949 | struct netxen_port_stats stats; | ||
950 | struct work_struct tx_timeout_task; | ||
951 | }; | ||
952 | |||
953 | #define PCI_OFFSET_FIRST_RANGE(adapter, off) \ | 936 | #define PCI_OFFSET_FIRST_RANGE(adapter, off) \ |
954 | ((adapter)->ahw.pci_base0 + (off)) | 937 | ((adapter)->ahw.pci_base0 + (off)) |
955 | #define PCI_OFFSET_SECOND_RANGE(adapter, off) \ | 938 | #define PCI_OFFSET_SECOND_RANGE(adapter, off) \ |
@@ -1011,8 +994,8 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long phy, | |||
1011 | long reg, __u32 val); | 994 | long reg, __u32 val); |
1012 | 995 | ||
1013 | /* Functions available from netxen_nic_hw.c */ | 996 | /* Functions available from netxen_nic_hw.c */ |
1014 | int netxen_nic_set_mtu_xgb(struct netxen_port *port, int new_mtu); | 997 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu); |
1015 | int netxen_nic_set_mtu_gb(struct netxen_port *port, int new_mtu); | 998 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu); |
1016 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter); | 999 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter); |
1017 | void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw); | 1000 | void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw); |
1018 | void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val); | 1001 | void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val); |
@@ -1051,11 +1034,8 @@ int netxen_do_rom_se(struct netxen_adapter *adapter, int addr); | |||
1051 | 1034 | ||
1052 | /* Functions from netxen_nic_isr.c */ | 1035 | /* Functions from netxen_nic_isr.c */ |
1053 | void netxen_nic_isr_other(struct netxen_adapter *adapter); | 1036 | void netxen_nic_isr_other(struct netxen_adapter *adapter); |
1054 | void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 port, | 1037 | void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 link); |
1055 | u32 link); | 1038 | void netxen_handle_port_int(struct netxen_adapter *adapter, u32 enable); |
1056 | void netxen_handle_port_int(struct netxen_adapter *adapter, u32 port, | ||
1057 | u32 enable); | ||
1058 | void netxen_nic_stop_all_ports(struct netxen_adapter *adapter); | ||
1059 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); | 1039 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); |
1060 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter); | 1040 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter); |
1061 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, | 1041 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, |
@@ -1110,6 +1090,7 @@ static inline void netxen_nic_enable_int(struct netxen_adapter *adapter) | |||
1110 | 1090 | ||
1111 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | 1091 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { |
1112 | mask = 0xbff; | 1092 | mask = 0xbff; |
1093 | writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); | ||
1113 | writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, | 1094 | writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, |
1114 | ISR_INT_TARGET_MASK)); | 1095 | ISR_INT_TARGET_MASK)); |
1115 | } | 1096 | } |