[SCSI] be2iscsi: Add support for configuring the VLAN on the adapter.
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / be2iscsi / be_iscsi.c
index 8efdd8e2d989db80ab4e7806aa79acf55d0f8b0d..ebb6c1fc16075b7a70964376e3187cc1e542be8b 100644 (file)
@@ -332,6 +332,51 @@ beiscsi_set_static_ip(struct Scsi_Host *shost,
        return ret;
 }
 
+/**
+ * beiscsi_set_vlan_tag()- Set the VLAN TAG
+ * @shost: Scsi Host for the driver instance
+ * @iface_param: Interface paramters
+ *
+ * Set the VLAN TAG for the adapter or disable
+ * the VLAN config
+ *
+ * returns
+ *     Success: 0
+ *     Failure: Non-Zero Value
+ **/
+static int
+beiscsi_set_vlan_tag(struct Scsi_Host *shost,
+                     struct iscsi_iface_param_info *iface_param)
+{
+       struct beiscsi_hba *phba = iscsi_host_priv(shost);
+       int ret = 0;
+
+       /* Get the Interface Handle */
+       if (mgmt_get_all_if_id(phba)) {
+               beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
+                           "BS_%d : Getting Interface Handle Failed\n");
+               return -EIO;
+       }
+
+       switch (iface_param->param) {
+       case ISCSI_NET_PARAM_VLAN_ENABLED:
+               if (iface_param->value[0] != ISCSI_VLAN_ENABLE)
+                       ret = mgmt_set_vlan(phba, BEISCSI_VLAN_DISABLE);
+               break;
+       case ISCSI_NET_PARAM_VLAN_TAG:
+               ret = mgmt_set_vlan(phba,
+                                   *((uint16_t *)iface_param->value));
+               break;
+       default:
+               beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
+                           "BS_%d : Unkown Param Type : %d\n",
+                           iface_param->param);
+               return -ENOSYS;
+       }
+       return ret;
+}
+
+
 static int
 beiscsi_set_ipv4(struct Scsi_Host *shost,
                struct iscsi_iface_param_info *iface_param,
@@ -368,6 +413,10 @@ beiscsi_set_ipv4(struct Scsi_Host *shost,
                ret = beiscsi_set_static_ip(shost, iface_param,
                                            data, dt_len);
                break;
+       case ISCSI_NET_PARAM_VLAN_ENABLED:
+       case ISCSI_NET_PARAM_VLAN_TAG:
+               ret = beiscsi_set_vlan_tag(shost, iface_param);
+               break;
        default:
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
                            "BS_%d : Param %d not supported\n",
@@ -489,6 +538,27 @@ static int be2iscsi_get_if_param(struct beiscsi_hba *phba,
        case ISCSI_NET_PARAM_IPV4_SUBNET:
                len = sprintf(buf, "%pI4\n", &if_info.ip_addr.subnet_mask);
                break;
+       case ISCSI_NET_PARAM_VLAN_ENABLED:
+               len = sprintf(buf, "%s\n",
+                            (if_info.vlan_priority == BEISCSI_VLAN_DISABLE)
+                            ? "Disabled" : "Enabled");
+               break;
+       case ISCSI_NET_PARAM_VLAN_ID:
+               if (if_info.vlan_priority == BEISCSI_VLAN_DISABLE)
+                       return -EINVAL;
+               else
+                       len = sprintf(buf, "%d\n",
+                                    (if_info.vlan_priority &
+                                    ISCSI_MAX_VLAN_ID));
+               break;
+       case ISCSI_NET_PARAM_VLAN_PRIORITY:
+               if (if_info.vlan_priority == BEISCSI_VLAN_DISABLE)
+                       return -EINVAL;
+               else
+                       len = sprintf(buf, "%d\n",
+                                    ((if_info.vlan_priority >> 13) &
+                                    ISCSI_MAX_VLAN_PRIORITY));
+               break;
        default:
                WARN_ON(1);
        }
@@ -510,6 +580,9 @@ int be2iscsi_iface_get_param(struct iscsi_iface *iface,
        case ISCSI_NET_PARAM_IPV4_SUBNET:
        case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
        case ISCSI_NET_PARAM_IPV6_ADDR:
+       case ISCSI_NET_PARAM_VLAN_ENABLED:
+       case ISCSI_NET_PARAM_VLAN_ID:
+       case ISCSI_NET_PARAM_VLAN_PRIORITY:
                len = be2iscsi_get_if_param(phba, iface, param, buf);
                break;
        case ISCSI_NET_PARAM_IFACE_ENABLE:
@@ -1233,6 +1306,9 @@ umode_t be2iscsi_attr_is_visible(int param_type, int param)
                case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
                case ISCSI_NET_PARAM_IPV4_GW:
                case ISCSI_NET_PARAM_IPV6_ADDR:
+               case ISCSI_NET_PARAM_VLAN_ID:
+               case ISCSI_NET_PARAM_VLAN_PRIORITY:
+               case ISCSI_NET_PARAM_VLAN_ENABLED:
                        return S_IRUGO;
                default:
                        return 0;