qeth: OSA version of SETBRIDGEPORT command
[firefly-linux-kernel-4.4.55.git] / drivers / s390 / net / qeth_l2_main.c
index 0ff926d4d63d278d84a37047c59ebbbbf9ac1897..789377c7d5efa3402f2048b5b707527d9afe122a 100644 (file)
@@ -1028,7 +1028,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
        qeth_bridgeport_query_support(card);
        if (card->options.sbp.supported_funcs)
                dev_info(&card->gdev->dev,
-               "The device represents a HiperSockets Bridge Capable Port\n");
+               "The device represents a Bridge Capable Port\n");
        qeth_trace_features(card);
 
        if (!card->dev && qeth_l2_setup_netdev(card)) {
@@ -1281,7 +1281,8 @@ static int qeth_l2_control_event(struct qeth_card *card,
                                        struct qeth_ipa_cmd *cmd)
 {
        switch (cmd->hdr.command) {
-       case IPA_CMD_SETBRIDGEPORT:
+       case IPA_CMD_SETBRIDGEPORT_OSA:
+       case IPA_CMD_SETBRIDGEPORT_IQD:
                if (cmd->data.sbp.hdr.command_code ==
                                IPA_SBP_BRIDGE_PORT_STATE_CHANGE) {
                        qeth_bridge_state_change(card, cmd);
@@ -1567,7 +1568,7 @@ static void qeth_bridge_host_event_worker(struct work_struct *work)
 
        if (data->hostevs.lost_event_mask) {
                dev_info(&data->card->gdev->dev,
-"Address notification from the HiperSockets Bridge Port stopped %s (%s)\n",
+"Address notification from the Bridge Port stopped %s (%s)\n",
                        data->card->dev->name,
                        (data->hostevs.lost_event_mask == 0x01)
                        ? "Overflow"
@@ -1651,70 +1652,80 @@ static int qeth_bridgeport_makerc(struct qeth_card *card,
        struct _qeth_sbp_cbctl *cbctl, enum qeth_ipa_sbp_cmd setcmd)
 {
        int rc;
+       int is_iqd = (card->info.type == QETH_CARD_TYPE_IQD);
 
-       switch (cbctl->ipa_rc) {
-       case IPA_RC_SUCCESS:
+       if ((is_iqd && (cbctl->ipa_rc == IPA_RC_SUCCESS)) ||
+           (!is_iqd && (cbctl->ipa_rc == cbctl->cmd_rc)))
                switch (cbctl->cmd_rc) {
                case 0x0000:
                        rc = 0;
                        break;
+               case 0x2B04:
                case 0x0004:
                        rc = -ENOSYS;
                        break;
+               case 0x2B0C:
                case 0x000C: /* Not configured as bridge Port */
                        rc = -ENODEV; /* maybe not the best code here? */
                        dev_err(&card->gdev->dev,
-       "The HiperSockets device is not configured as a Bridge Port\n");
+       "The device is not configured as a Bridge Port\n");
                        break;
+               case 0x2B14:
                case 0x0014: /* Another device is Primary */
                        switch (setcmd) {
                        case IPA_SBP_SET_PRIMARY_BRIDGE_PORT:
                                rc = -EEXIST;
                                dev_err(&card->gdev->dev,
-       "The HiperSockets LAN already has a primary Bridge Port\n");
+       "The LAN already has a primary Bridge Port\n");
                                break;
                        case IPA_SBP_SET_SECONDARY_BRIDGE_PORT:
                                rc = -EBUSY;
                                dev_err(&card->gdev->dev,
-       "The HiperSockets device is already a primary Bridge Port\n");
+       "The device is already a primary Bridge Port\n");
                                break;
                        default:
                                rc = -EIO;
                        }
                        break;
+               case 0x2B18:
                case 0x0018: /* This device is currently Secondary */
                        rc = -EBUSY;
                        dev_err(&card->gdev->dev,
-       "The HiperSockets device is already a secondary Bridge Port\n");
+       "The device is already a secondary Bridge Port\n");
                        break;
+               case 0x2B1C:
                case 0x001C: /* Limit for Secondary devices reached */
                        rc = -EEXIST;
                        dev_err(&card->gdev->dev,
-       "The HiperSockets LAN cannot have more secondary Bridge Ports\n");
+       "The LAN cannot have more secondary Bridge Ports\n");
                        break;
+               case 0x2B24:
                case 0x0024: /* This device is currently Primary */
                        rc = -EBUSY;
                        dev_err(&card->gdev->dev,
-       "The HiperSockets device is already a primary Bridge Port\n");
+       "The device is already a primary Bridge Port\n");
                        break;
+               case 0x2B20:
                case 0x0020: /* Not authorized by zManager */
                        rc = -EACCES;
                        dev_err(&card->gdev->dev,
-       "The HiperSockets device is not authorized to be a Bridge Port\n");
+       "The device is not authorized to be a Bridge Port\n");
                        break;
                default:
                        rc = -EIO;
                }
-               break;
-       case IPA_RC_NOTSUPP:
-               rc = -ENOSYS;
-               break;
-       case IPA_RC_UNSUPPORTED_COMMAND:
-               rc = -ENOSYS;
-               break;
-       default:
-               rc = -EIO;
-       }
+       else
+               switch (cbctl->ipa_rc) {
+               case IPA_RC_NOTSUPP:
+                       rc = -ENOSYS;
+                       break;
+               case IPA_RC_UNSUPPORTED_COMMAND:
+                       rc = -ENOSYS;
+                       break;
+               default:
+                       rc = -EIO;
+               }
+
        if (rc) {
                QETH_CARD_TEXT_(card, 2, "SBPi%04x", cbctl->ipa_rc);
                QETH_CARD_TEXT_(card, 2, "SBPc%04x", cbctl->cmd_rc);
@@ -1722,6 +1733,13 @@ static int qeth_bridgeport_makerc(struct qeth_card *card,
        return rc;
 }
 
+static inline int ipa_cmd_sbp(struct qeth_card *card)
+{
+       return (card->info.type == QETH_CARD_TYPE_IQD) ?
+               IPA_CMD_SETBRIDGEPORT_IQD :
+               IPA_CMD_SETBRIDGEPORT_OSA;
+}
+
 static int qeth_bridgeport_query_support_cb(struct qeth_card *card,
        struct qeth_reply *reply, unsigned long data)
 {
@@ -1753,7 +1771,7 @@ static void qeth_bridgeport_query_support(struct qeth_card *card)
        struct _qeth_sbp_cbctl cbctl;
 
        QETH_CARD_TEXT(card, 2, "brqsuppo");
-       iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
+       iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
        if (!iob)
                return;
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
@@ -1830,7 +1848,7 @@ int qeth_bridgeport_query_ports(struct qeth_card *card,
        QETH_CARD_TEXT(card, 2, "brqports");
        if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS))
                return -EOPNOTSUPP;
-       iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
+       iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
        if (!iob)
                return -ENOMEM;
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
@@ -1897,7 +1915,7 @@ int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role)
        }
        if (!(card->options.sbp.supported_funcs & setcmd))
                return -EOPNOTSUPP;
-       iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
+       iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
        if (!iob)
                return -ENOMEM;
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);