aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSucheta Chakraborty <sucheta.chakraborty@qlogic.com>2012-05-09 01:55:29 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-09 22:53:04 -0400
commitd612698b6246032370b96abc9afe94c8a66772c2 (patch)
treead1e8b8b6a3889c2c7d4807d1561cac2f5807a19
parentd8c3e77298cf0f103e6e70fb54014e2aed494c3e (diff)
netxen: added miniDIMM support in driver.
Driver queries DIMM information from firmware and accordingly sets "presence" field of the structure. "presence" field when set to 0xff denotes invalid flag. And when set to 0x0 denotes DIMM memory is not present. Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com> Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/netxen/netxen_nic.h7
-rw-r--r--drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h25
-rw-r--r--drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c131
3 files changed, 163 insertions, 0 deletions
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic.h b/drivers/net/ethernet/qlogic/netxen/netxen_nic.h
index ecc8d1769708..11b4922a1781 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic.h
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic.h
@@ -1817,6 +1817,13 @@ struct netxen_brdinfo {
1817 char short_name[NETXEN_MAX_SHORT_NAME]; 1817 char short_name[NETXEN_MAX_SHORT_NAME];
1818}; 1818};
1819 1819
1820struct netxen_dimm_cfg {
1821 u8 presence;
1822 u8 mem_type;
1823 u8 dimm_type;
1824 u32 size;
1825};
1826
1820static const struct netxen_brdinfo netxen_boards[] = { 1827static const struct netxen_brdinfo netxen_boards[] = {
1821 {NETXEN_BRDTYPE_P2_SB31_10G_CX4, 1, "XGb CX4"}, 1828 {NETXEN_BRDTYPE_P2_SB31_10G_CX4, 1, "XGb CX4"},
1822 {NETXEN_BRDTYPE_P2_SB31_10G_HMEZ, 1, "XGb HMEZ"}, 1829 {NETXEN_BRDTYPE_P2_SB31_10G_HMEZ, 1, "XGb HMEZ"},
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h b/drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h
index b1a897cd9a8d..a41106ba9719 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h
@@ -955,6 +955,31 @@ enum {
955#define NX_CRB_DEV_REF_COUNT (NETXEN_CAM_RAM(0x138)) 955#define NX_CRB_DEV_REF_COUNT (NETXEN_CAM_RAM(0x138))
956#define NX_CRB_DEV_STATE (NETXEN_CAM_RAM(0x140)) 956#define NX_CRB_DEV_STATE (NETXEN_CAM_RAM(0x140))
957 957
958/* MiniDIMM related macros */
959#define NETXEN_DIMM_CAPABILITY (NETXEN_CAM_RAM(0x258))
960#define NETXEN_DIMM_PRESENT 0x1
961#define NETXEN_DIMM_MEMTYPE_DDR2_SDRAM 0x2
962#define NETXEN_DIMM_SIZE 0x4
963#define NETXEN_DIMM_MEMTYPE(VAL) ((VAL >> 3) & 0xf)
964#define NETXEN_DIMM_NUMROWS(VAL) ((VAL >> 7) & 0xf)
965#define NETXEN_DIMM_NUMCOLS(VAL) ((VAL >> 11) & 0xf)
966#define NETXEN_DIMM_NUMRANKS(VAL) ((VAL >> 15) & 0x3)
967#define NETXEN_DIMM_DATAWIDTH(VAL) ((VAL >> 18) & 0x3)
968#define NETXEN_DIMM_NUMBANKS(VAL) ((VAL >> 21) & 0xf)
969#define NETXEN_DIMM_TYPE(VAL) ((VAL >> 25) & 0x3f)
970#define NETXEN_DIMM_VALID_FLAG 0x80000000
971
972#define NETXEN_DIMM_MEM_DDR2_SDRAM 0x8
973
974#define NETXEN_DIMM_STD_MEM_SIZE 512
975
976#define NETXEN_DIMM_TYPE_RDIMM 0x1
977#define NETXEN_DIMM_TYPE_UDIMM 0x2
978#define NETXEN_DIMM_TYPE_SO_DIMM 0x4
979#define NETXEN_DIMM_TYPE_Micro_DIMM 0x8
980#define NETXEN_DIMM_TYPE_Mini_RDIMM 0x10
981#define NETXEN_DIMM_TYPE_Mini_UDIMM 0x20
982
958/* Device State */ 983/* Device State */
959#define NX_DEV_COLD 1 984#define NX_DEV_COLD 1
960#define NX_DEV_INITALIZING 2 985#define NX_DEV_INITALIZING 2
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
index 65a718f9ccd3..d03619cab8dd 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
@@ -2926,6 +2926,134 @@ static struct bin_attribute bin_attr_mem = {
2926 .write = netxen_sysfs_write_mem, 2926 .write = netxen_sysfs_write_mem,
2927}; 2927};
2928 2928
2929static ssize_t
2930netxen_sysfs_read_dimm(struct file *filp, struct kobject *kobj,
2931 struct bin_attribute *attr,
2932 char *buf, loff_t offset, size_t size)
2933{
2934 struct device *dev = container_of(kobj, struct device, kobj);
2935 struct netxen_adapter *adapter = dev_get_drvdata(dev);
2936 struct net_device *netdev = adapter->netdev;
2937 struct netxen_dimm_cfg dimm;
2938 u8 dw, rows, cols, banks, ranks;
2939 u32 val;
2940
2941 if (size != sizeof(struct netxen_dimm_cfg)) {
2942 netdev_err(netdev, "Invalid size\n");
2943 return -1;
2944 }
2945
2946 memset(&dimm, 0, sizeof(struct netxen_dimm_cfg));
2947 val = NXRD32(adapter, NETXEN_DIMM_CAPABILITY);
2948
2949 /* Checks if DIMM info is valid. */
2950 if (val & NETXEN_DIMM_VALID_FLAG) {
2951 netdev_err(netdev, "Invalid DIMM flag\n");
2952 dimm.presence = 0xff;
2953 goto out;
2954 }
2955
2956 rows = NETXEN_DIMM_NUMROWS(val);
2957 cols = NETXEN_DIMM_NUMCOLS(val);
2958 ranks = NETXEN_DIMM_NUMRANKS(val);
2959 banks = NETXEN_DIMM_NUMBANKS(val);
2960 dw = NETXEN_DIMM_DATAWIDTH(val);
2961
2962 dimm.presence = (val & NETXEN_DIMM_PRESENT);
2963
2964 /* Checks if DIMM info is present. */
2965 if (!dimm.presence) {
2966 netdev_err(netdev, "DIMM not present\n");
2967 goto out;
2968 }
2969
2970 dimm.dimm_type = NETXEN_DIMM_TYPE(val);
2971
2972 switch (dimm.dimm_type) {
2973 case NETXEN_DIMM_TYPE_RDIMM:
2974 case NETXEN_DIMM_TYPE_UDIMM:
2975 case NETXEN_DIMM_TYPE_SO_DIMM:
2976 case NETXEN_DIMM_TYPE_Micro_DIMM:
2977 case NETXEN_DIMM_TYPE_Mini_RDIMM:
2978 case NETXEN_DIMM_TYPE_Mini_UDIMM:
2979 break;
2980 default:
2981 netdev_err(netdev, "Invalid DIMM type %x\n", dimm.dimm_type);
2982 goto out;
2983 }
2984
2985 if (val & NETXEN_DIMM_MEMTYPE_DDR2_SDRAM)
2986 dimm.mem_type = NETXEN_DIMM_MEM_DDR2_SDRAM;
2987 else
2988 dimm.mem_type = NETXEN_DIMM_MEMTYPE(val);
2989
2990 if (val & NETXEN_DIMM_SIZE) {
2991 dimm.size = NETXEN_DIMM_STD_MEM_SIZE;
2992 goto out;
2993 }
2994
2995 if (!rows) {
2996 netdev_err(netdev, "Invalid no of rows %x\n", rows);
2997 goto out;
2998 }
2999
3000 if (!cols) {
3001 netdev_err(netdev, "Invalid no of columns %x\n", cols);
3002 goto out;
3003 }
3004
3005 if (!banks) {
3006 netdev_err(netdev, "Invalid no of banks %x\n", banks);
3007 goto out;
3008 }
3009
3010 ranks += 1;
3011
3012 switch (dw) {
3013 case 0x0:
3014 dw = 32;
3015 break;
3016 case 0x1:
3017 dw = 33;
3018 break;
3019 case 0x2:
3020 dw = 36;
3021 break;
3022 case 0x3:
3023 dw = 64;
3024 break;
3025 case 0x4:
3026 dw = 72;
3027 break;
3028 case 0x5:
3029 dw = 80;
3030 break;
3031 case 0x6:
3032 dw = 128;
3033 break;
3034 case 0x7:
3035 dw = 144;
3036 break;
3037 default:
3038 netdev_err(netdev, "Invalid data-width %x\n", dw);
3039 goto out;
3040 }
3041
3042 dimm.size = ((1 << rows) * (1 << cols) * dw * banks * ranks) / 8;
3043 /* Size returned in MB. */
3044 dimm.size = (dimm.size) / 0x100000;
3045out:
3046 memcpy(buf, &dimm, sizeof(struct netxen_dimm_cfg));
3047 return sizeof(struct netxen_dimm_cfg);
3048
3049}
3050
3051static struct bin_attribute bin_attr_dimm = {
3052 .attr = { .name = "dimm", .mode = (S_IRUGO | S_IWUSR) },
3053 .size = 0,
3054 .read = netxen_sysfs_read_dimm,
3055};
3056
2929 3057
2930static void 3058static void
2931netxen_create_sysfs_entries(struct netxen_adapter *adapter) 3059netxen_create_sysfs_entries(struct netxen_adapter *adapter)
@@ -2963,6 +3091,8 @@ netxen_create_diag_entries(struct netxen_adapter *adapter)
2963 dev_info(dev, "failed to create crb sysfs entry\n"); 3091 dev_info(dev, "failed to create crb sysfs entry\n");
2964 if (device_create_bin_file(dev, &bin_attr_mem)) 3092 if (device_create_bin_file(dev, &bin_attr_mem))
2965 dev_info(dev, "failed to create mem sysfs entry\n"); 3093 dev_info(dev, "failed to create mem sysfs entry\n");
3094 if (device_create_bin_file(dev, &bin_attr_dimm))
3095 dev_info(dev, "failed to create dimm sysfs entry\n");
2966} 3096}
2967 3097
2968 3098
@@ -2975,6 +3105,7 @@ netxen_remove_diag_entries(struct netxen_adapter *adapter)
2975 device_remove_file(dev, &dev_attr_diag_mode); 3105 device_remove_file(dev, &dev_attr_diag_mode);
2976 device_remove_bin_file(dev, &bin_attr_crb); 3106 device_remove_bin_file(dev, &bin_attr_crb);
2977 device_remove_bin_file(dev, &bin_attr_mem); 3107 device_remove_bin_file(dev, &bin_attr_mem);
3108 device_remove_bin_file(dev, &bin_attr_dimm);
2978} 3109}
2979 3110
2980#ifdef CONFIG_INET 3111#ifdef CONFIG_INET