aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
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 /drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
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>
Diffstat (limited to 'drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c')
-rw-r--r--drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c131
1 files changed, 131 insertions, 0 deletions
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