2008-02-15 11:19:42 +03:00
/*
* drivers / s390 / net / qeth_core_mpc . c
*
* Copyright IBM Corp . 2007
* Author ( s ) : Frank Pavlic < fpavlic @ de . ibm . com > ,
* Thomas Spatzier < tspat @ de . ibm . com > ,
* Frank Blaschka < frank . blaschka @ de . ibm . com >
*/
# include <linux/module.h>
# include <asm/cio.h>
# include "qeth_core_mpc.h"
unsigned char IDX_ACTIVATE_READ [ ] = {
0x00 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x19 , 0x01 , 0x01 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xc8 , 0xc1 ,
0xd3 , 0xd3 , 0xd6 , 0xd3 , 0xc5 , 0x40 , 0x00 , 0x00 ,
0x00 , 0x00
} ;
unsigned char IDX_ACTIVATE_WRITE [ ] = {
0x00 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x15 , 0x01 , 0x01 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 ,
0xff , 0xff , 0x00 , 0x00 , 0x00 , 0x00 , 0xc8 , 0xc1 ,
0xd3 , 0xd3 , 0xd6 , 0xd3 , 0xc5 , 0x40 , 0x00 , 0x00 ,
0x00 , 0x00
} ;
unsigned char CM_ENABLE [ ] = {
0x00 , 0xe0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x14 , 0x00 , 0x00 , 0x00 , 0x63 ,
0x10 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x81 , 0x7e , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x24 , 0x00 , 0x23 ,
0x00 , 0x00 , 0x23 , 0x05 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 , 0x00 , 0x23 , 0x00 , 0x00 , 0x00 , 0x40 ,
0x00 , 0x0c , 0x41 , 0x02 , 0x00 , 0x17 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x0b , 0x04 , 0x01 ,
0x7e , 0x04 , 0x05 , 0x00 , 0x01 , 0x01 , 0x0f ,
0x00 ,
0x0c , 0x04 , 0x02 , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff
} ;
unsigned char CM_SETUP [ ] = {
0x00 , 0xe0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ,
0x00 , 0x00 , 0x00 , 0x14 , 0x00 , 0x00 , 0x00 , 0x64 ,
0x10 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x81 , 0x7e , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x24 , 0x00 , 0x24 ,
0x00 , 0x00 , 0x24 , 0x05 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 , 0x00 , 0x24 , 0x00 , 0x00 , 0x00 , 0x40 ,
0x00 , 0x0c , 0x41 , 0x04 , 0x00 , 0x18 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x09 , 0x04 , 0x04 ,
0x05 , 0x00 , 0x01 , 0x01 , 0x11 ,
0x00 , 0x09 , 0x04 ,
0x05 , 0x05 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x06 ,
0x04 , 0x06 , 0xc8 , 0x00
} ;
unsigned char ULP_ENABLE [ ] = {
0x00 , 0xe0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 ,
0x00 , 0x00 , 0x00 , 0x14 , 0x00 , 0x00 , 0x00 , 0x6b ,
0x10 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x41 , 0x7e , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x24 , 0x00 , 0x2b ,
0x00 , 0x00 , 0x2b , 0x05 , 0x20 , 0x01 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 , 0x00 , 0x2b , 0x00 , 0x00 , 0x00 , 0x40 ,
0x00 , 0x0c , 0x41 , 0x02 , 0x00 , 0x1f , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x0b , 0x04 , 0x01 ,
0x03 , 0x04 , 0x05 , 0x00 , 0x01 , 0x01 , 0x12 ,
0x00 ,
0x14 , 0x04 , 0x0a , 0x00 , 0x20 , 0x00 , 0x00 , 0xff ,
0xff , 0x00 , 0x08 , 0xc8 , 0xe8 , 0xc4 , 0xf1 , 0xc7 ,
0xf1 , 0x00 , 0x00
} ;
unsigned char ULP_SETUP [ ] = {
0x00 , 0xe0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x04 ,
0x00 , 0x00 , 0x00 , 0x14 , 0x00 , 0x00 , 0x00 , 0x6c ,
0x10 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x41 , 0x7e , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x02 ,
0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x24 , 0x00 , 0x2c ,
0x00 , 0x00 , 0x2c , 0x05 , 0x20 , 0x01 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 , 0x00 , 0x2c , 0x00 , 0x00 , 0x00 , 0x40 ,
0x00 , 0x0c , 0x41 , 0x04 , 0x00 , 0x20 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x09 , 0x04 , 0x04 ,
0x05 , 0x00 , 0x01 , 0x01 , 0x14 ,
0x00 , 0x09 , 0x04 ,
0x05 , 0x05 , 0x30 , 0x01 , 0x00 , 0x00 ,
0x00 , 0x06 ,
0x04 , 0x06 , 0x40 , 0x00 ,
0x00 , 0x08 , 0x04 , 0x0b ,
0x00 , 0x00 , 0x00 , 0x00
} ;
unsigned char DM_ACT [ ] = {
0x00 , 0xe0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x05 ,
0x00 , 0x00 , 0x00 , 0x14 , 0x00 , 0x00 , 0x00 , 0x55 ,
0x10 , 0x00 , 0x00 , 0x01 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x41 , 0x7e , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x03 ,
0x00 , 0x00 , 0x00 , 0x02 , 0x00 , 0x24 , 0x00 , 0x15 ,
0x00 , 0x00 , 0x2c , 0x05 , 0x20 , 0x01 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 , 0x00 , 0x15 , 0x00 , 0x00 , 0x00 , 0x40 ,
0x00 , 0x0c , 0x43 , 0x60 , 0x00 , 0x09 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x09 , 0x04 , 0x04 ,
0x05 , 0x40 , 0x01 , 0x01 , 0x00
} ;
unsigned char IPA_PDU_HEADER [ ] = {
0x00 , 0xe0 , 0x00 , 0x00 , 0x77 , 0x77 , 0x77 , 0x77 ,
0x00 , 0x00 , 0x00 , 0x14 , 0x00 , 0x00 ,
( IPA_PDU_HEADER_SIZE + sizeof ( struct qeth_ipa_cmd ) ) / 256 ,
( IPA_PDU_HEADER_SIZE + sizeof ( struct qeth_ipa_cmd ) ) % 256 ,
0x10 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 ,
0xc1 , 0x03 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x24 ,
sizeof ( struct qeth_ipa_cmd ) / 256 ,
sizeof ( struct qeth_ipa_cmd ) % 256 ,
0x00 ,
sizeof ( struct qeth_ipa_cmd ) / 256 ,
sizeof ( struct qeth_ipa_cmd ) % 256 ,
0x05 ,
0x77 , 0x77 , 0x77 , 0x77 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 ,
sizeof ( struct qeth_ipa_cmd ) / 256 ,
sizeof ( struct qeth_ipa_cmd ) % 256 ,
0x00 , 0x00 , 0x00 , 0x40 ,
} ;
EXPORT_SYMBOL_GPL ( IPA_PDU_HEADER ) ;
unsigned char WRITE_CCW [ ] = {
0x01 , CCW_FLAG_SLI , 0 , 0 ,
0 , 0 , 0 , 0
} ;
unsigned char READ_CCW [ ] = {
0x02 , CCW_FLAG_SLI , 0 , 0 ,
0 , 0 , 0 , 0
} ;
struct ipa_rc_msg {
enum qeth_ipa_return_codes rc ;
char * msg ;
} ;
static struct ipa_rc_msg qeth_ipa_rc_msg [ ] = {
{ IPA_RC_SUCCESS , " success " } ,
{ IPA_RC_NOTSUPP , " Command not supported " } ,
{ IPA_RC_IP_TABLE_FULL , " Add Addr IP Table Full - ipv6 " } ,
{ IPA_RC_UNKNOWN_ERROR , " IPA command failed - reason unknown " } ,
{ IPA_RC_UNSUPPORTED_COMMAND , " Command not supported " } ,
{ IPA_RC_DUP_IPV6_REMOTE , " ipv6 address already registered remote " } ,
{ IPA_RC_DUP_IPV6_HOME , " ipv6 address already registered " } ,
{ IPA_RC_UNREGISTERED_ADDR , " Address not registered " } ,
{ IPA_RC_NO_ID_AVAILABLE , " No identifiers available " } ,
{ IPA_RC_ID_NOT_FOUND , " Identifier not found " } ,
{ IPA_RC_INVALID_IP_VERSION , " IP version incorrect " } ,
{ IPA_RC_LAN_FRAME_MISMATCH , " LAN and frame mismatch " } ,
{ IPA_RC_L2_UNSUPPORTED_CMD , " Unsupported layer 2 command " } ,
{ IPA_RC_L2_DUP_MAC , " Duplicate MAC address " } ,
{ IPA_RC_L2_ADDR_TABLE_FULL , " Layer2 address table full " } ,
{ IPA_RC_L2_DUP_LAYER3_MAC , " Duplicate with layer 3 MAC " } ,
{ IPA_RC_L2_GMAC_NOT_FOUND , " GMAC not found " } ,
2009-05-20 01:38:39 +04:00
{ IPA_RC_L2_MAC_NOT_AUTH_BY_HYP , " L2 mac not authorized by hypervisor " } ,
{ IPA_RC_L2_MAC_NOT_AUTH_BY_ADP , " L2 mac not authorized by adapter " } ,
2008-02-15 11:19:42 +03:00
{ IPA_RC_L2_MAC_NOT_FOUND , " L2 mac address not found " } ,
{ IPA_RC_L2_INVALID_VLAN_ID , " L2 invalid vlan id " } ,
{ IPA_RC_L2_DUP_VLAN_ID , " L2 duplicate vlan id " } ,
{ IPA_RC_L2_VLAN_ID_NOT_FOUND , " L2 vlan id not found " } ,
{ IPA_RC_DATA_MISMATCH , " Data field mismatch (v4/v6 mixed) " } ,
{ IPA_RC_INVALID_MTU_SIZE , " Invalid MTU size " } ,
{ IPA_RC_INVALID_LANTYPE , " Invalid LAN type " } ,
{ IPA_RC_INVALID_LANNUM , " Invalid LAN num " } ,
{ IPA_RC_DUPLICATE_IP_ADDRESS , " Address already registered " } ,
{ IPA_RC_IP_ADDR_TABLE_FULL , " IP address table full " } ,
{ IPA_RC_LAN_PORT_STATE_ERROR , " LAN port state error " } ,
{ IPA_RC_SETIP_NO_STARTLAN , " Setip no startlan received " } ,
{ IPA_RC_SETIP_ALREADY_RECEIVED , " Setip already received " } ,
{ IPA_RC_IP_ADDR_ALREADY_USED , " IP address already in use on LAN " } ,
2008-04-01 12:26:53 +04:00
{ IPA_RC_MC_ADDR_NOT_FOUND , " Multicast address not found " } ,
2008-02-15 11:19:42 +03:00
{ IPA_RC_SETIP_INVALID_VERSION , " SETIP invalid IP version " } ,
{ IPA_RC_UNSUPPORTED_SUBCMD , " Unsupported assist subcommand " } ,
{ IPA_RC_ARP_ASSIST_NO_ENABLE , " Only partial success, no enable " } ,
{ IPA_RC_PRIMARY_ALREADY_DEFINED , " Primary already defined " } ,
{ IPA_RC_SECOND_ALREADY_DEFINED , " Secondary already defined " } ,
{ IPA_RC_INVALID_SETRTG_INDICATOR , " Invalid SETRTG indicator " } ,
{ IPA_RC_MC_ADDR_ALREADY_DEFINED , " Multicast address already defined " } ,
{ IPA_RC_LAN_OFFLINE , " STRTLAN_LAN_DISABLED - LAN offline " } ,
{ IPA_RC_INVALID_IP_VERSION2 , " Invalid IP version " } ,
{ IPA_RC_FFFF , " Unknown Error " }
} ;
char * qeth_get_ipa_msg ( enum qeth_ipa_return_codes rc )
{
int x = 0 ;
qeth_ipa_rc_msg [ sizeof ( qeth_ipa_rc_msg ) /
sizeof ( struct ipa_rc_msg ) - 1 ] . rc = rc ;
while ( qeth_ipa_rc_msg [ x ] . rc ! = rc )
x + + ;
return qeth_ipa_rc_msg [ x ] . msg ;
}
struct ipa_cmd_names {
enum qeth_ipa_cmds cmd ;
char * name ;
} ;
static struct ipa_cmd_names qeth_ipa_cmd_names [ ] = {
{ IPA_CMD_STARTLAN , " startlan " } ,
{ IPA_CMD_STOPLAN , " stoplan " } ,
{ IPA_CMD_SETVMAC , " setvmac " } ,
2008-04-01 12:26:58 +04:00
{ IPA_CMD_DELVMAC , " delvmac " } ,
2008-02-15 11:19:42 +03:00
{ IPA_CMD_SETGMAC , " setgmac " } ,
{ IPA_CMD_DELGMAC , " delgmac " } ,
{ IPA_CMD_SETVLAN , " setvlan " } ,
{ IPA_CMD_DELVLAN , " delvlan " } ,
{ IPA_CMD_SETCCID , " setccid " } ,
{ IPA_CMD_DELCCID , " delccid " } ,
{ IPA_CMD_MODCCID , " modccid " } ,
{ IPA_CMD_SETIP , " setip " } ,
{ IPA_CMD_QIPASSIST , " qipassist " } ,
{ IPA_CMD_SETASSPARMS , " setassparms " } ,
{ IPA_CMD_SETIPM , " setipm " } ,
{ IPA_CMD_DELIPM , " delipm " } ,
{ IPA_CMD_SETRTG , " setrtg " } ,
{ IPA_CMD_DELIP , " delip " } ,
{ IPA_CMD_SETADAPTERPARMS , " setadapterparms " } ,
{ IPA_CMD_SET_DIAG_ASS , " set_diag_ass " } ,
{ IPA_CMD_CREATE_ADDR , " create_addr " } ,
{ IPA_CMD_DESTROY_ADDR , " destroy_addr " } ,
{ IPA_CMD_REGISTER_LOCAL_ADDR , " register_local_addr " } ,
{ IPA_CMD_UNREGISTER_LOCAL_ADDR , " unregister_local_addr " } ,
{ IPA_CMD_UNKNOWN , " unknown " } ,
} ;
char * qeth_get_ipa_cmd_name ( enum qeth_ipa_cmds cmd )
{
int x = 0 ;
qeth_ipa_cmd_names [
sizeof ( qeth_ipa_cmd_names ) /
sizeof ( struct ipa_cmd_names ) - 1 ] . cmd = cmd ;
while ( qeth_ipa_cmd_names [ x ] . cmd ! = cmd )
x + + ;
return qeth_ipa_cmd_names [ x ] . name ;
}