aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Crosser <Eugene.Crosser@ru.ibm.com>2015-05-18 08:27:56 -0400
committerDavid S. Miller <davem@davemloft.net>2015-05-18 12:14:17 -0400
commit9c23f4dab1a467f41a27c7d7b87a987c5a3cfc2d (patch)
treecbb9fc2b8d5182c3efa79b64782e027dd0f6a131
parent0db587b065cb3d0417c4e84be851e787d207e8e0 (diff)
qeth: OSA version of SETBRIDGEPORT command
OSA Ethernet hardware is introducing BRIDGEPORT functionality similar (but not identical) to HiperSockets BRIDGEPORT. This patch makes HiperSockets BRIDGEPORT related sysfs attributes and udev events work with OSA hardware too. Reviewed-by: Thomas Richter <tmricht@linux.vnet.ibm.com> Signed-off-by: Eugene Crosser <Eugene.Crosser@ru.ibm.com> Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/s390/qeth.txt4
-rw-r--r--drivers/s390/net/qeth_core_main.c3
-rw-r--r--drivers/s390/net/qeth_core_mpc.c3
-rw-r--r--drivers/s390/net/qeth_core_mpc.h3
-rw-r--r--drivers/s390/net/qeth_l2_main.c68
5 files changed, 51 insertions, 30 deletions
diff --git a/Documentation/s390/qeth.txt b/Documentation/s390/qeth.txt
index 74122ada9949..aa06fcf5f8c2 100644
--- a/Documentation/s390/qeth.txt
+++ b/Documentation/s390/qeth.txt
@@ -1,6 +1,6 @@
1IBM s390 QDIO Ethernet Driver 1IBM s390 QDIO Ethernet Driver
2 2
3HiperSockets Bridge Port Support 3OSA and HiperSockets Bridge Port Support
4 4
5Uevents 5Uevents
6 6
@@ -8,7 +8,7 @@ To generate the events the device must be assigned a role of either
8a primary or a secondary Bridge Port. For more information, see 8a primary or a secondary Bridge Port. For more information, see
9"z/VM Connectivity, SC24-6174". 9"z/VM Connectivity, SC24-6174".
10 10
11When run on HiperSockets Bridge Capable Port hardware, and the state 11When run on an OSA or HiperSockets Bridge Capable Port hardware, and the state
12of some configured Bridge Port device on the channel changes, a udev 12of some configured Bridge Port device on the channel changes, a udev
13event with ACTION=CHANGE is emitted on behalf of the corresponding 13event with ACTION=CHANGE is emitted on behalf of the corresponding
14ccwgroup device. The event has the following attributes: 14ccwgroup device. The event has the following attributes:
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 3466d3cb7647..5e20fba37bff 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -645,7 +645,8 @@ static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
645 card->info.hwtrap = 2; 645 card->info.hwtrap = 2;
646 qeth_schedule_recovery(card); 646 qeth_schedule_recovery(card);
647 return NULL; 647 return NULL;
648 case IPA_CMD_SETBRIDGEPORT: 648 case IPA_CMD_SETBRIDGEPORT_IQD:
649 case IPA_CMD_SETBRIDGEPORT_OSA:
649 case IPA_CMD_ADDRESS_CHANGE_NOTIF: 650 case IPA_CMD_ADDRESS_CHANGE_NOTIF:
650 if (card->discipline->control_event_handler 651 if (card->discipline->control_event_handler
651 (card, cmd)) 652 (card, cmd))
diff --git a/drivers/s390/net/qeth_core_mpc.c b/drivers/s390/net/qeth_core_mpc.c
index 7b55768a9592..beb4bdc26de5 100644
--- a/drivers/s390/net/qeth_core_mpc.c
+++ b/drivers/s390/net/qeth_core_mpc.c
@@ -237,6 +237,7 @@ static struct ipa_cmd_names qeth_ipa_cmd_names[] = {
237 {IPA_CMD_DELGMAC, "delgmac"}, 237 {IPA_CMD_DELGMAC, "delgmac"},
238 {IPA_CMD_SETVLAN, "setvlan"}, 238 {IPA_CMD_SETVLAN, "setvlan"},
239 {IPA_CMD_DELVLAN, "delvlan"}, 239 {IPA_CMD_DELVLAN, "delvlan"},
240 {IPA_CMD_SETBRIDGEPORT_OSA, "set_bridge_port(osa)"},
240 {IPA_CMD_SETCCID, "setccid"}, 241 {IPA_CMD_SETCCID, "setccid"},
241 {IPA_CMD_DELCCID, "delccid"}, 242 {IPA_CMD_DELCCID, "delccid"},
242 {IPA_CMD_MODCCID, "modccid"}, 243 {IPA_CMD_MODCCID, "modccid"},
@@ -249,7 +250,7 @@ static struct ipa_cmd_names qeth_ipa_cmd_names[] = {
249 {IPA_CMD_DELIP, "delip"}, 250 {IPA_CMD_DELIP, "delip"},
250 {IPA_CMD_SETADAPTERPARMS, "setadapterparms"}, 251 {IPA_CMD_SETADAPTERPARMS, "setadapterparms"},
251 {IPA_CMD_SET_DIAG_ASS, "set_diag_ass"}, 252 {IPA_CMD_SET_DIAG_ASS, "set_diag_ass"},
252 {IPA_CMD_SETBRIDGEPORT, "set_bridge_port"}, 253 {IPA_CMD_SETBRIDGEPORT_IQD, "set_bridge_port(hs)"},
253 {IPA_CMD_CREATE_ADDR, "create_addr"}, 254 {IPA_CMD_CREATE_ADDR, "create_addr"},
254 {IPA_CMD_DESTROY_ADDR, "destroy_addr"}, 255 {IPA_CMD_DESTROY_ADDR, "destroy_addr"},
255 {IPA_CMD_REGISTER_LOCAL_ADDR, "register_local_addr"}, 256 {IPA_CMD_REGISTER_LOCAL_ADDR, "register_local_addr"},
diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h
index 1558be1af72d..6cccc9a49ede 100644
--- a/drivers/s390/net/qeth_core_mpc.h
+++ b/drivers/s390/net/qeth_core_mpc.h
@@ -92,6 +92,7 @@ enum qeth_ipa_cmds {
92 IPA_CMD_DELGMAC = 0x24, 92 IPA_CMD_DELGMAC = 0x24,
93 IPA_CMD_SETVLAN = 0x25, 93 IPA_CMD_SETVLAN = 0x25,
94 IPA_CMD_DELVLAN = 0x26, 94 IPA_CMD_DELVLAN = 0x26,
95 IPA_CMD_SETBRIDGEPORT_OSA = 0x2b,
95 IPA_CMD_SETCCID = 0x41, 96 IPA_CMD_SETCCID = 0x41,
96 IPA_CMD_DELCCID = 0x42, 97 IPA_CMD_DELCCID = 0x42,
97 IPA_CMD_MODCCID = 0x43, 98 IPA_CMD_MODCCID = 0x43,
@@ -104,7 +105,7 @@ enum qeth_ipa_cmds {
104 IPA_CMD_DELIP = 0xb7, 105 IPA_CMD_DELIP = 0xb7,
105 IPA_CMD_SETADAPTERPARMS = 0xb8, 106 IPA_CMD_SETADAPTERPARMS = 0xb8,
106 IPA_CMD_SET_DIAG_ASS = 0xb9, 107 IPA_CMD_SET_DIAG_ASS = 0xb9,
107 IPA_CMD_SETBRIDGEPORT = 0xbe, 108 IPA_CMD_SETBRIDGEPORT_IQD = 0xbe,
108 IPA_CMD_CREATE_ADDR = 0xc3, 109 IPA_CMD_CREATE_ADDR = 0xc3,
109 IPA_CMD_DESTROY_ADDR = 0xc4, 110 IPA_CMD_DESTROY_ADDR = 0xc4,
110 IPA_CMD_REGISTER_LOCAL_ADDR = 0xd1, 111 IPA_CMD_REGISTER_LOCAL_ADDR = 0xd1,
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 0ff926d4d63d..789377c7d5ef 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -1028,7 +1028,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
1028 qeth_bridgeport_query_support(card); 1028 qeth_bridgeport_query_support(card);
1029 if (card->options.sbp.supported_funcs) 1029 if (card->options.sbp.supported_funcs)
1030 dev_info(&card->gdev->dev, 1030 dev_info(&card->gdev->dev,
1031 "The device represents a HiperSockets Bridge Capable Port\n"); 1031 "The device represents a Bridge Capable Port\n");
1032 qeth_trace_features(card); 1032 qeth_trace_features(card);
1033 1033
1034 if (!card->dev && qeth_l2_setup_netdev(card)) { 1034 if (!card->dev && qeth_l2_setup_netdev(card)) {
@@ -1281,7 +1281,8 @@ static int qeth_l2_control_event(struct qeth_card *card,
1281 struct qeth_ipa_cmd *cmd) 1281 struct qeth_ipa_cmd *cmd)
1282{ 1282{
1283 switch (cmd->hdr.command) { 1283 switch (cmd->hdr.command) {
1284 case IPA_CMD_SETBRIDGEPORT: 1284 case IPA_CMD_SETBRIDGEPORT_OSA:
1285 case IPA_CMD_SETBRIDGEPORT_IQD:
1285 if (cmd->data.sbp.hdr.command_code == 1286 if (cmd->data.sbp.hdr.command_code ==
1286 IPA_SBP_BRIDGE_PORT_STATE_CHANGE) { 1287 IPA_SBP_BRIDGE_PORT_STATE_CHANGE) {
1287 qeth_bridge_state_change(card, cmd); 1288 qeth_bridge_state_change(card, cmd);
@@ -1567,7 +1568,7 @@ static void qeth_bridge_host_event_worker(struct work_struct *work)
1567 1568
1568 if (data->hostevs.lost_event_mask) { 1569 if (data->hostevs.lost_event_mask) {
1569 dev_info(&data->card->gdev->dev, 1570 dev_info(&data->card->gdev->dev,
1570"Address notification from the HiperSockets Bridge Port stopped %s (%s)\n", 1571"Address notification from the Bridge Port stopped %s (%s)\n",
1571 data->card->dev->name, 1572 data->card->dev->name,
1572 (data->hostevs.lost_event_mask == 0x01) 1573 (data->hostevs.lost_event_mask == 0x01)
1573 ? "Overflow" 1574 ? "Overflow"
@@ -1651,70 +1652,80 @@ static int qeth_bridgeport_makerc(struct qeth_card *card,
1651 struct _qeth_sbp_cbctl *cbctl, enum qeth_ipa_sbp_cmd setcmd) 1652 struct _qeth_sbp_cbctl *cbctl, enum qeth_ipa_sbp_cmd setcmd)
1652{ 1653{
1653 int rc; 1654 int rc;
1655 int is_iqd = (card->info.type == QETH_CARD_TYPE_IQD);
1654 1656
1655 switch (cbctl->ipa_rc) { 1657 if ((is_iqd && (cbctl->ipa_rc == IPA_RC_SUCCESS)) ||
1656 case IPA_RC_SUCCESS: 1658 (!is_iqd && (cbctl->ipa_rc == cbctl->cmd_rc)))
1657 switch (cbctl->cmd_rc) { 1659 switch (cbctl->cmd_rc) {
1658 case 0x0000: 1660 case 0x0000:
1659 rc = 0; 1661 rc = 0;
1660 break; 1662 break;
1663 case 0x2B04:
1661 case 0x0004: 1664 case 0x0004:
1662 rc = -ENOSYS; 1665 rc = -ENOSYS;
1663 break; 1666 break;
1667 case 0x2B0C:
1664 case 0x000C: /* Not configured as bridge Port */ 1668 case 0x000C: /* Not configured as bridge Port */
1665 rc = -ENODEV; /* maybe not the best code here? */ 1669 rc = -ENODEV; /* maybe not the best code here? */
1666 dev_err(&card->gdev->dev, 1670 dev_err(&card->gdev->dev,
1667 "The HiperSockets device is not configured as a Bridge Port\n"); 1671 "The device is not configured as a Bridge Port\n");
1668 break; 1672 break;
1673 case 0x2B14:
1669 case 0x0014: /* Another device is Primary */ 1674 case 0x0014: /* Another device is Primary */
1670 switch (setcmd) { 1675 switch (setcmd) {
1671 case IPA_SBP_SET_PRIMARY_BRIDGE_PORT: 1676 case IPA_SBP_SET_PRIMARY_BRIDGE_PORT:
1672 rc = -EEXIST; 1677 rc = -EEXIST;
1673 dev_err(&card->gdev->dev, 1678 dev_err(&card->gdev->dev,
1674 "The HiperSockets LAN already has a primary Bridge Port\n"); 1679 "The LAN already has a primary Bridge Port\n");
1675 break; 1680 break;
1676 case IPA_SBP_SET_SECONDARY_BRIDGE_PORT: 1681 case IPA_SBP_SET_SECONDARY_BRIDGE_PORT:
1677 rc = -EBUSY; 1682 rc = -EBUSY;
1678 dev_err(&card->gdev->dev, 1683 dev_err(&card->gdev->dev,
1679 "The HiperSockets device is already a primary Bridge Port\n"); 1684 "The device is already a primary Bridge Port\n");
1680 break; 1685 break;
1681 default: 1686 default:
1682 rc = -EIO; 1687 rc = -EIO;
1683 } 1688 }
1684 break; 1689 break;
1690 case 0x2B18:
1685 case 0x0018: /* This device is currently Secondary */ 1691 case 0x0018: /* This device is currently Secondary */
1686 rc = -EBUSY; 1692 rc = -EBUSY;
1687 dev_err(&card->gdev->dev, 1693 dev_err(&card->gdev->dev,
1688 "The HiperSockets device is already a secondary Bridge Port\n"); 1694 "The device is already a secondary Bridge Port\n");
1689 break; 1695 break;
1696 case 0x2B1C:
1690 case 0x001C: /* Limit for Secondary devices reached */ 1697 case 0x001C: /* Limit for Secondary devices reached */
1691 rc = -EEXIST; 1698 rc = -EEXIST;
1692 dev_err(&card->gdev->dev, 1699 dev_err(&card->gdev->dev,
1693 "The HiperSockets LAN cannot have more secondary Bridge Ports\n"); 1700 "The LAN cannot have more secondary Bridge Ports\n");
1694 break; 1701 break;
1702 case 0x2B24:
1695 case 0x0024: /* This device is currently Primary */ 1703 case 0x0024: /* This device is currently Primary */
1696 rc = -EBUSY; 1704 rc = -EBUSY;
1697 dev_err(&card->gdev->dev, 1705 dev_err(&card->gdev->dev,
1698 "The HiperSockets device is already a primary Bridge Port\n"); 1706 "The device is already a primary Bridge Port\n");
1699 break; 1707 break;
1708 case 0x2B20:
1700 case 0x0020: /* Not authorized by zManager */ 1709 case 0x0020: /* Not authorized by zManager */
1701 rc = -EACCES; 1710 rc = -EACCES;
1702 dev_err(&card->gdev->dev, 1711 dev_err(&card->gdev->dev,
1703 "The HiperSockets device is not authorized to be a Bridge Port\n"); 1712 "The device is not authorized to be a Bridge Port\n");
1704 break; 1713 break;
1705 default: 1714 default:
1706 rc = -EIO; 1715 rc = -EIO;
1707 } 1716 }
1708 break; 1717 else
1709 case IPA_RC_NOTSUPP: 1718 switch (cbctl->ipa_rc) {
1710 rc = -ENOSYS; 1719 case IPA_RC_NOTSUPP:
1711 break; 1720 rc = -ENOSYS;
1712 case IPA_RC_UNSUPPORTED_COMMAND: 1721 break;
1713 rc = -ENOSYS; 1722 case IPA_RC_UNSUPPORTED_COMMAND:
1714 break; 1723 rc = -ENOSYS;
1715 default: 1724 break;
1716 rc = -EIO; 1725 default:
1717 } 1726 rc = -EIO;
1727 }
1728
1718 if (rc) { 1729 if (rc) {
1719 QETH_CARD_TEXT_(card, 2, "SBPi%04x", cbctl->ipa_rc); 1730 QETH_CARD_TEXT_(card, 2, "SBPi%04x", cbctl->ipa_rc);
1720 QETH_CARD_TEXT_(card, 2, "SBPc%04x", cbctl->cmd_rc); 1731 QETH_CARD_TEXT_(card, 2, "SBPc%04x", cbctl->cmd_rc);
@@ -1722,6 +1733,13 @@ static int qeth_bridgeport_makerc(struct qeth_card *card,
1722 return rc; 1733 return rc;
1723} 1734}
1724 1735
1736static inline int ipa_cmd_sbp(struct qeth_card *card)
1737{
1738 return (card->info.type == QETH_CARD_TYPE_IQD) ?
1739 IPA_CMD_SETBRIDGEPORT_IQD :
1740 IPA_CMD_SETBRIDGEPORT_OSA;
1741}
1742
1725static int qeth_bridgeport_query_support_cb(struct qeth_card *card, 1743static int qeth_bridgeport_query_support_cb(struct qeth_card *card,
1726 struct qeth_reply *reply, unsigned long data) 1744 struct qeth_reply *reply, unsigned long data)
1727{ 1745{
@@ -1753,7 +1771,7 @@ static void qeth_bridgeport_query_support(struct qeth_card *card)
1753 struct _qeth_sbp_cbctl cbctl; 1771 struct _qeth_sbp_cbctl cbctl;
1754 1772
1755 QETH_CARD_TEXT(card, 2, "brqsuppo"); 1773 QETH_CARD_TEXT(card, 2, "brqsuppo");
1756 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); 1774 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1757 if (!iob) 1775 if (!iob)
1758 return; 1776 return;
1759 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1777 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
@@ -1830,7 +1848,7 @@ int qeth_bridgeport_query_ports(struct qeth_card *card,
1830 QETH_CARD_TEXT(card, 2, "brqports"); 1848 QETH_CARD_TEXT(card, 2, "brqports");
1831 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) 1849 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS))
1832 return -EOPNOTSUPP; 1850 return -EOPNOTSUPP;
1833 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); 1851 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1834 if (!iob) 1852 if (!iob)
1835 return -ENOMEM; 1853 return -ENOMEM;
1836 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1854 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)
1897 } 1915 }
1898 if (!(card->options.sbp.supported_funcs & setcmd)) 1916 if (!(card->options.sbp.supported_funcs & setcmd))
1899 return -EOPNOTSUPP; 1917 return -EOPNOTSUPP;
1900 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); 1918 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1901 if (!iob) 1919 if (!iob)
1902 return -ENOMEM; 1920 return -ENOMEM;
1903 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1921 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);