1a6a5580cSJeff Kirsher /* 2a6a5580cSJeff Kirsher * Copyright 2011 Cisco Systems, Inc. All rights reserved. 3a6a5580cSJeff Kirsher * 4a6a5580cSJeff Kirsher * This program is free software; you may redistribute it and/or modify 5a6a5580cSJeff Kirsher * it under the terms of the GNU General Public License as published by 6a6a5580cSJeff Kirsher * the Free Software Foundation; version 2 of the License. 7a6a5580cSJeff Kirsher * 8a6a5580cSJeff Kirsher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9a6a5580cSJeff Kirsher * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10a6a5580cSJeff Kirsher * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11a6a5580cSJeff Kirsher * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12a6a5580cSJeff Kirsher * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13a6a5580cSJeff Kirsher * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14a6a5580cSJeff Kirsher * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15a6a5580cSJeff Kirsher * SOFTWARE. 16a6a5580cSJeff Kirsher * 17a6a5580cSJeff Kirsher */ 18a6a5580cSJeff Kirsher 19a6a5580cSJeff Kirsher #include <linux/kernel.h> 20a6a5580cSJeff Kirsher #include <linux/string.h> 21a6a5580cSJeff Kirsher #include <linux/errno.h> 22a6a5580cSJeff Kirsher #include <linux/types.h> 23a6a5580cSJeff Kirsher #include <linux/netdevice.h> 24a6a5580cSJeff Kirsher #include <linux/etherdevice.h> 25a6a5580cSJeff Kirsher #include <linux/rtnetlink.h> 26a6a5580cSJeff Kirsher #include <net/ip.h> 27a6a5580cSJeff Kirsher 28a6a5580cSJeff Kirsher #include "vnic_vic.h" 29a6a5580cSJeff Kirsher #include "enic_res.h" 30a6a5580cSJeff Kirsher #include "enic.h" 31a6a5580cSJeff Kirsher #include "enic_dev.h" 323f192795SRoopa Prabhu #include "enic_pp.h" 33a6a5580cSJeff Kirsher 343f192795SRoopa Prabhu /* 353f192795SRoopa Prabhu * Checks validity of vf index that came in 363f192795SRoopa Prabhu * port profile request 373f192795SRoopa Prabhu */ 383f192795SRoopa Prabhu int enic_is_valid_pp_vf(struct enic *enic, int vf, int *err) 393f192795SRoopa Prabhu { 403f192795SRoopa Prabhu if (vf != PORT_SELF_VF) { 413f192795SRoopa Prabhu #ifdef CONFIG_PCI_IOV 423f192795SRoopa Prabhu if (enic_sriov_enabled(enic)) { 433f192795SRoopa Prabhu if (vf < 0 || vf >= enic->num_vfs) { 443f192795SRoopa Prabhu *err = -EINVAL; 453f192795SRoopa Prabhu goto err_out; 463f192795SRoopa Prabhu } 473f192795SRoopa Prabhu } else { 483f192795SRoopa Prabhu *err = -EOPNOTSUPP; 493f192795SRoopa Prabhu goto err_out; 503f192795SRoopa Prabhu } 513f192795SRoopa Prabhu #else 523f192795SRoopa Prabhu *err = -EOPNOTSUPP; 533f192795SRoopa Prabhu goto err_out; 543f192795SRoopa Prabhu #endif 553f192795SRoopa Prabhu } 563f192795SRoopa Prabhu 573f192795SRoopa Prabhu if (vf == PORT_SELF_VF && !enic_is_dynamic(enic)) { 583f192795SRoopa Prabhu *err = -EOPNOTSUPP; 593f192795SRoopa Prabhu goto err_out; 603f192795SRoopa Prabhu } 613f192795SRoopa Prabhu 623f192795SRoopa Prabhu *err = 0; 633f192795SRoopa Prabhu return 1; 643f192795SRoopa Prabhu 653f192795SRoopa Prabhu err_out: 663f192795SRoopa Prabhu return 0; 673f192795SRoopa Prabhu } 683f192795SRoopa Prabhu 693f192795SRoopa Prabhu static int enic_set_port_profile(struct enic *enic, int vf) 70a6a5580cSJeff Kirsher { 71a6a5580cSJeff Kirsher struct net_device *netdev = enic->netdev; 723f192795SRoopa Prabhu struct enic_port_profile *pp; 73a6a5580cSJeff Kirsher struct vic_provinfo *vp; 74a6a5580cSJeff Kirsher const u8 oui[3] = VIC_PROVINFO_CISCO_OUI; 7521ca54e9SSantosh Nayak const __be16 os_type = htons(VIC_GENERIC_PROV_OS_TYPE_LINUX); 76*76660757SJakub Kicinski const u8 *client_mac; 77a6a5580cSJeff Kirsher char uuid_str[38]; 78a6a5580cSJeff Kirsher char client_mac_str[18]; 79a6a5580cSJeff Kirsher int err; 80a6a5580cSJeff Kirsher 813f192795SRoopa Prabhu ENIC_PP_BY_INDEX(enic, vf, pp, &err); 823f192795SRoopa Prabhu if (err) 833f192795SRoopa Prabhu return err; 843f192795SRoopa Prabhu 853f192795SRoopa Prabhu if (!(pp->set & ENIC_SET_NAME) || !strlen(pp->name)) 86a6a5580cSJeff Kirsher return -EINVAL; 87a6a5580cSJeff Kirsher 88a6a5580cSJeff Kirsher vp = vic_provinfo_alloc(GFP_KERNEL, oui, 89a6a5580cSJeff Kirsher VIC_PROVINFO_GENERIC_TYPE); 90a6a5580cSJeff Kirsher if (!vp) 91a6a5580cSJeff Kirsher return -ENOMEM; 92a6a5580cSJeff Kirsher 93a6a5580cSJeff Kirsher VIC_PROVINFO_ADD_TLV(vp, 94a6a5580cSJeff Kirsher VIC_GENERIC_PROV_TLV_PORT_PROFILE_NAME_STR, 953f192795SRoopa Prabhu strlen(pp->name) + 1, pp->name); 96a6a5580cSJeff Kirsher 973f192795SRoopa Prabhu if (!is_zero_ether_addr(pp->mac_addr)) { 983f192795SRoopa Prabhu client_mac = pp->mac_addr; 993f192795SRoopa Prabhu } else if (vf == PORT_SELF_VF) { 100a6a5580cSJeff Kirsher client_mac = netdev->dev_addr; 1013f192795SRoopa Prabhu } else { 1023f192795SRoopa Prabhu netdev_err(netdev, "Cannot find pp mac address " 1033f192795SRoopa Prabhu "for VF %d\n", vf); 1043f192795SRoopa Prabhu err = -EINVAL; 1053f192795SRoopa Prabhu goto add_tlv_failure; 1063f192795SRoopa Prabhu } 107a6a5580cSJeff Kirsher 108a6a5580cSJeff Kirsher VIC_PROVINFO_ADD_TLV(vp, 109a6a5580cSJeff Kirsher VIC_GENERIC_PROV_TLV_CLIENT_MAC_ADDR, 110a6a5580cSJeff Kirsher ETH_ALEN, client_mac); 111a6a5580cSJeff Kirsher 112a6a5580cSJeff Kirsher snprintf(client_mac_str, sizeof(client_mac_str), "%pM", client_mac); 113a6a5580cSJeff Kirsher VIC_PROVINFO_ADD_TLV(vp, 114a6a5580cSJeff Kirsher VIC_GENERIC_PROV_TLV_CLUSTER_PORT_UUID_STR, 115a6a5580cSJeff Kirsher sizeof(client_mac_str), client_mac_str); 116a6a5580cSJeff Kirsher 1173f192795SRoopa Prabhu if (pp->set & ENIC_SET_INSTANCE) { 1183f192795SRoopa Prabhu sprintf(uuid_str, "%pUB", pp->instance_uuid); 119a6a5580cSJeff Kirsher VIC_PROVINFO_ADD_TLV(vp, 120a6a5580cSJeff Kirsher VIC_GENERIC_PROV_TLV_CLIENT_UUID_STR, 121a6a5580cSJeff Kirsher sizeof(uuid_str), uuid_str); 122a6a5580cSJeff Kirsher } 123a6a5580cSJeff Kirsher 1243f192795SRoopa Prabhu if (pp->set & ENIC_SET_HOST) { 1253f192795SRoopa Prabhu sprintf(uuid_str, "%pUB", pp->host_uuid); 126a6a5580cSJeff Kirsher VIC_PROVINFO_ADD_TLV(vp, 127a6a5580cSJeff Kirsher VIC_GENERIC_PROV_TLV_HOST_UUID_STR, 128a6a5580cSJeff Kirsher sizeof(uuid_str), uuid_str); 129a6a5580cSJeff Kirsher } 130a6a5580cSJeff Kirsher 131a6a5580cSJeff Kirsher VIC_PROVINFO_ADD_TLV(vp, 132a6a5580cSJeff Kirsher VIC_GENERIC_PROV_TLV_OS_TYPE, 133a6a5580cSJeff Kirsher sizeof(os_type), &os_type); 134a6a5580cSJeff Kirsher 1353f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_init_prov2, (u8 *)vp, 1363f192795SRoopa Prabhu vic_provinfo_size(vp)); 1373f192795SRoopa Prabhu err = enic_dev_status_to_errno(err); 138a6a5580cSJeff Kirsher 139a6a5580cSJeff Kirsher add_tlv_failure: 140a6a5580cSJeff Kirsher vic_provinfo_free(vp); 141a6a5580cSJeff Kirsher 142a6a5580cSJeff Kirsher return err; 143a6a5580cSJeff Kirsher } 144a6a5580cSJeff Kirsher 1453f192795SRoopa Prabhu static int enic_unset_port_profile(struct enic *enic, int vf) 146a6a5580cSJeff Kirsher { 147a6a5580cSJeff Kirsher int err; 148a6a5580cSJeff Kirsher 1493f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_deinit); 150a6a5580cSJeff Kirsher if (err) 151a6a5580cSJeff Kirsher return enic_dev_status_to_errno(err); 152a6a5580cSJeff Kirsher 1533f192795SRoopa Prabhu if (vf == PORT_SELF_VF) 154a6a5580cSJeff Kirsher enic_reset_addr_lists(enic); 155a6a5580cSJeff Kirsher 156a6a5580cSJeff Kirsher return 0; 157a6a5580cSJeff Kirsher } 158a6a5580cSJeff Kirsher 159a6a5580cSJeff Kirsher static int enic_are_pp_different(struct enic_port_profile *pp1, 160a6a5580cSJeff Kirsher struct enic_port_profile *pp2) 161a6a5580cSJeff Kirsher { 162a6a5580cSJeff Kirsher return strcmp(pp1->name, pp2->name) | !!memcmp(pp1->instance_uuid, 163a6a5580cSJeff Kirsher pp2->instance_uuid, PORT_UUID_MAX) | 164a6a5580cSJeff Kirsher !!memcmp(pp1->host_uuid, pp2->host_uuid, PORT_UUID_MAX) | 1659130ac61Sdingtianhong !ether_addr_equal(pp1->mac_addr, pp2->mac_addr); 166a6a5580cSJeff Kirsher } 167a6a5580cSJeff Kirsher 1683f192795SRoopa Prabhu static int enic_pp_preassociate(struct enic *enic, int vf, 169a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp); 1703f192795SRoopa Prabhu static int enic_pp_disassociate(struct enic *enic, int vf, 171a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp); 1723f192795SRoopa Prabhu static int enic_pp_preassociate_rr(struct enic *enic, int vf, 173a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp); 1743f192795SRoopa Prabhu static int enic_pp_associate(struct enic *enic, int vf, 175a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp); 176a6a5580cSJeff Kirsher 1773f192795SRoopa Prabhu static int (*enic_pp_handlers[])(struct enic *enic, int vf, 1783f192795SRoopa Prabhu struct enic_port_profile *prev_state, 1793f192795SRoopa Prabhu int *restore_pp) = { 180a6a5580cSJeff Kirsher [PORT_REQUEST_PREASSOCIATE] = enic_pp_preassociate, 181a6a5580cSJeff Kirsher [PORT_REQUEST_PREASSOCIATE_RR] = enic_pp_preassociate_rr, 182a6a5580cSJeff Kirsher [PORT_REQUEST_ASSOCIATE] = enic_pp_associate, 183a6a5580cSJeff Kirsher [PORT_REQUEST_DISASSOCIATE] = enic_pp_disassociate, 184a6a5580cSJeff Kirsher }; 185a6a5580cSJeff Kirsher 186a6a5580cSJeff Kirsher static const int enic_pp_handlers_count = 1874133099bSJim Cromie ARRAY_SIZE(enic_pp_handlers); 188a6a5580cSJeff Kirsher 1893f192795SRoopa Prabhu static int enic_pp_preassociate(struct enic *enic, int vf, 190a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp) 191a6a5580cSJeff Kirsher { 192a6a5580cSJeff Kirsher return -EOPNOTSUPP; 193a6a5580cSJeff Kirsher } 194a6a5580cSJeff Kirsher 1953f192795SRoopa Prabhu static int enic_pp_disassociate(struct enic *enic, int vf, 196a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp) 197a6a5580cSJeff Kirsher { 1983f192795SRoopa Prabhu struct net_device *netdev = enic->netdev; 1993f192795SRoopa Prabhu struct enic_port_profile *pp; 2003f192795SRoopa Prabhu int err; 2013f192795SRoopa Prabhu 2023f192795SRoopa Prabhu ENIC_PP_BY_INDEX(enic, vf, pp, &err); 2033f192795SRoopa Prabhu if (err) 2043f192795SRoopa Prabhu return err; 2053f192795SRoopa Prabhu 2063f192795SRoopa Prabhu /* Deregister mac addresses */ 2073f192795SRoopa Prabhu if (!is_zero_ether_addr(pp->mac_addr)) 2083f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_del_addr, 2093f192795SRoopa Prabhu pp->mac_addr); 2109f1de88dSRoopa Prabhu else if (vf == PORT_SELF_VF && !is_zero_ether_addr(netdev->dev_addr)) 2113f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_del_addr, 2123f192795SRoopa Prabhu netdev->dev_addr); 2133f192795SRoopa Prabhu 2143f192795SRoopa Prabhu return enic_unset_port_profile(enic, vf); 215a6a5580cSJeff Kirsher } 216a6a5580cSJeff Kirsher 2173f192795SRoopa Prabhu static int enic_pp_preassociate_rr(struct enic *enic, int vf, 218a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp) 219a6a5580cSJeff Kirsher { 2203f192795SRoopa Prabhu struct enic_port_profile *pp; 221a6a5580cSJeff Kirsher int err; 222a6a5580cSJeff Kirsher int active = 0; 223a6a5580cSJeff Kirsher 2243f192795SRoopa Prabhu ENIC_PP_BY_INDEX(enic, vf, pp, &err); 2253f192795SRoopa Prabhu if (err) 2263f192795SRoopa Prabhu return err; 2273f192795SRoopa Prabhu 2283f192795SRoopa Prabhu if (pp->request != PORT_REQUEST_ASSOCIATE) { 229a6a5580cSJeff Kirsher /* If pre-associate is not part of an associate. 230a6a5580cSJeff Kirsher We always disassociate first */ 2313f192795SRoopa Prabhu err = enic_pp_handlers[PORT_REQUEST_DISASSOCIATE](enic, vf, 232a6a5580cSJeff Kirsher prev_pp, restore_pp); 233a6a5580cSJeff Kirsher if (err) 234a6a5580cSJeff Kirsher return err; 235a6a5580cSJeff Kirsher 236a6a5580cSJeff Kirsher *restore_pp = 0; 237a6a5580cSJeff Kirsher } 238a6a5580cSJeff Kirsher 239a6a5580cSJeff Kirsher *restore_pp = 0; 240a6a5580cSJeff Kirsher 2413f192795SRoopa Prabhu err = enic_set_port_profile(enic, vf); 242a6a5580cSJeff Kirsher if (err) 243a6a5580cSJeff Kirsher return err; 244a6a5580cSJeff Kirsher 245a6a5580cSJeff Kirsher /* If pre-associate is not part of an associate. */ 2463f192795SRoopa Prabhu if (pp->request != PORT_REQUEST_ASSOCIATE) { 2473f192795SRoopa Prabhu /* Enable device as standby */ 2483f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_enable2, 2493f192795SRoopa Prabhu active); 2503f192795SRoopa Prabhu err = enic_dev_status_to_errno(err); 2513f192795SRoopa Prabhu } 252a6a5580cSJeff Kirsher 253a6a5580cSJeff Kirsher return err; 254a6a5580cSJeff Kirsher } 255a6a5580cSJeff Kirsher 2563f192795SRoopa Prabhu static int enic_pp_associate(struct enic *enic, int vf, 257a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp) 258a6a5580cSJeff Kirsher { 2593f192795SRoopa Prabhu struct net_device *netdev = enic->netdev; 2603f192795SRoopa Prabhu struct enic_port_profile *pp; 261a6a5580cSJeff Kirsher int err; 262a6a5580cSJeff Kirsher int active = 1; 263a6a5580cSJeff Kirsher 2643f192795SRoopa Prabhu ENIC_PP_BY_INDEX(enic, vf, pp, &err); 2653f192795SRoopa Prabhu if (err) 2663f192795SRoopa Prabhu return err; 2673f192795SRoopa Prabhu 268a6a5580cSJeff Kirsher /* Check if a pre-associate was called before */ 269a6a5580cSJeff Kirsher if (prev_pp->request != PORT_REQUEST_PREASSOCIATE_RR || 270a6a5580cSJeff Kirsher (prev_pp->request == PORT_REQUEST_PREASSOCIATE_RR && 2713f192795SRoopa Prabhu enic_are_pp_different(prev_pp, pp))) { 272a6a5580cSJeff Kirsher err = enic_pp_handlers[PORT_REQUEST_DISASSOCIATE]( 2733f192795SRoopa Prabhu enic, vf, prev_pp, restore_pp); 274a6a5580cSJeff Kirsher if (err) 275a6a5580cSJeff Kirsher return err; 276a6a5580cSJeff Kirsher 277a6a5580cSJeff Kirsher *restore_pp = 0; 278a6a5580cSJeff Kirsher } 279a6a5580cSJeff Kirsher 280a6a5580cSJeff Kirsher err = enic_pp_handlers[PORT_REQUEST_PREASSOCIATE_RR]( 2813f192795SRoopa Prabhu enic, vf, prev_pp, restore_pp); 282a6a5580cSJeff Kirsher if (err) 283a6a5580cSJeff Kirsher return err; 284a6a5580cSJeff Kirsher 285a6a5580cSJeff Kirsher *restore_pp = 0; 286a6a5580cSJeff Kirsher 2873f192795SRoopa Prabhu /* Enable device as active */ 2883f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_enable2, active); 2893f192795SRoopa Prabhu err = enic_dev_status_to_errno(err); 2903f192795SRoopa Prabhu if (err) 2913f192795SRoopa Prabhu return err; 2923f192795SRoopa Prabhu 2933f192795SRoopa Prabhu /* Register mac address */ 2943f192795SRoopa Prabhu if (!is_zero_ether_addr(pp->mac_addr)) 2953f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_add_addr, 2963f192795SRoopa Prabhu pp->mac_addr); 2979f1de88dSRoopa Prabhu else if (vf == PORT_SELF_VF && !is_zero_ether_addr(netdev->dev_addr)) 2983f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_add_addr, 2993f192795SRoopa Prabhu netdev->dev_addr); 3003f192795SRoopa Prabhu 3013f192795SRoopa Prabhu return 0; 302a6a5580cSJeff Kirsher } 303a6a5580cSJeff Kirsher 3043f192795SRoopa Prabhu int enic_process_set_pp_request(struct enic *enic, int vf, 305a6a5580cSJeff Kirsher struct enic_port_profile *prev_pp, int *restore_pp) 306a6a5580cSJeff Kirsher { 3073f192795SRoopa Prabhu struct enic_port_profile *pp; 3083f192795SRoopa Prabhu int err; 3093f192795SRoopa Prabhu 3103f192795SRoopa Prabhu ENIC_PP_BY_INDEX(enic, vf, pp, &err); 3113f192795SRoopa Prabhu if (err) 3123f192795SRoopa Prabhu return err; 3133f192795SRoopa Prabhu 3143f192795SRoopa Prabhu if (pp->request >= enic_pp_handlers_count 3153f192795SRoopa Prabhu || !enic_pp_handlers[pp->request]) 316a6a5580cSJeff Kirsher return -EOPNOTSUPP; 3173f192795SRoopa Prabhu 3183f192795SRoopa Prabhu return enic_pp_handlers[pp->request](enic, vf, prev_pp, restore_pp); 319a6a5580cSJeff Kirsher } 320a6a5580cSJeff Kirsher 3213f192795SRoopa Prabhu int enic_process_get_pp_request(struct enic *enic, int vf, 3223f192795SRoopa Prabhu int request, u16 *response) 323a6a5580cSJeff Kirsher { 324a6a5580cSJeff Kirsher int err, status = ERR_SUCCESS; 325a6a5580cSJeff Kirsher 326a6a5580cSJeff Kirsher switch (request) { 327a6a5580cSJeff Kirsher 328a6a5580cSJeff Kirsher case PORT_REQUEST_PREASSOCIATE_RR: 329a6a5580cSJeff Kirsher case PORT_REQUEST_ASSOCIATE: 3303f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, 3313f192795SRoopa Prabhu vnic_dev_enable2_done, &status); 332a6a5580cSJeff Kirsher break; 333a6a5580cSJeff Kirsher 334a6a5580cSJeff Kirsher case PORT_REQUEST_DISASSOCIATE: 3353f192795SRoopa Prabhu ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, 3363f192795SRoopa Prabhu vnic_dev_deinit_done, &status); 337a6a5580cSJeff Kirsher break; 338a6a5580cSJeff Kirsher 339a6a5580cSJeff Kirsher default: 340a6a5580cSJeff Kirsher return -EINVAL; 341a6a5580cSJeff Kirsher } 342a6a5580cSJeff Kirsher 343a6a5580cSJeff Kirsher if (err) 344a6a5580cSJeff Kirsher status = err; 345a6a5580cSJeff Kirsher 346a6a5580cSJeff Kirsher switch (status) { 347a6a5580cSJeff Kirsher case ERR_SUCCESS: 348a6a5580cSJeff Kirsher *response = PORT_PROFILE_RESPONSE_SUCCESS; 349a6a5580cSJeff Kirsher break; 350a6a5580cSJeff Kirsher case ERR_EINVAL: 351a6a5580cSJeff Kirsher *response = PORT_PROFILE_RESPONSE_INVALID; 352a6a5580cSJeff Kirsher break; 353a6a5580cSJeff Kirsher case ERR_EBADSTATE: 354a6a5580cSJeff Kirsher *response = PORT_PROFILE_RESPONSE_BADSTATE; 355a6a5580cSJeff Kirsher break; 356a6a5580cSJeff Kirsher case ERR_ENOMEM: 357a6a5580cSJeff Kirsher *response = PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES; 358a6a5580cSJeff Kirsher break; 359a6a5580cSJeff Kirsher case ERR_EINPROGRESS: 360a6a5580cSJeff Kirsher *response = PORT_PROFILE_RESPONSE_INPROGRESS; 361a6a5580cSJeff Kirsher break; 362a6a5580cSJeff Kirsher default: 363a6a5580cSJeff Kirsher *response = PORT_PROFILE_RESPONSE_ERROR; 364a6a5580cSJeff Kirsher break; 365a6a5580cSJeff Kirsher } 366a6a5580cSJeff Kirsher 367a6a5580cSJeff Kirsher return 0; 368a6a5580cSJeff Kirsher } 369