1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2aaf4363eSJerin Jacob * Copyright(c) 2017 Cavium, Inc 34d027880SJerin Jacob */ 44d027880SJerin Jacob 54d027880SJerin Jacob #include <string.h> 64d027880SJerin Jacob 74d027880SJerin Jacob #include "octeontx_bgx.h" 84d027880SJerin Jacob 94d027880SJerin Jacob int 104d027880SJerin Jacob octeontx_bgx_port_open(int port, octeontx_mbox_bgx_port_conf_t *conf) 114d027880SJerin Jacob { 124d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 134d027880SJerin Jacob octeontx_mbox_bgx_port_conf_t bgx_conf; 144d027880SJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_conf_t); 154d027880SJerin Jacob int res; 164d027880SJerin Jacob 174d027880SJerin Jacob memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t)); 184d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 194d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_OPEN; 204d027880SJerin Jacob hdr.vfid = port; 214d027880SJerin Jacob 22d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len); 234d027880SJerin Jacob if (res < 0) 244d027880SJerin Jacob return -EACCES; 254d027880SJerin Jacob 264d027880SJerin Jacob conf->enable = bgx_conf.enable; 274d027880SJerin Jacob conf->promisc = bgx_conf.promisc; 284d027880SJerin Jacob conf->bpen = bgx_conf.bpen; 294d027880SJerin Jacob conf->node = bgx_conf.node; 304d027880SJerin Jacob conf->base_chan = bgx_conf.base_chan; 314d027880SJerin Jacob conf->num_chans = bgx_conf.num_chans; 324d027880SJerin Jacob conf->mtu = bgx_conf.mtu; 334d027880SJerin Jacob conf->bgx = bgx_conf.bgx; 344d027880SJerin Jacob conf->lmac = bgx_conf.lmac; 354d027880SJerin Jacob conf->mode = bgx_conf.mode; 364d027880SJerin Jacob conf->pkind = bgx_conf.pkind; 374d027880SJerin Jacob memcpy(conf->macaddr, bgx_conf.macaddr, 6); 384d027880SJerin Jacob 394d027880SJerin Jacob return res; 404d027880SJerin Jacob } 414d027880SJerin Jacob 424d027880SJerin Jacob int 434d027880SJerin Jacob octeontx_bgx_port_close(int port) 444d027880SJerin Jacob { 454d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 464d027880SJerin Jacob int res; 474d027880SJerin Jacob 484d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 494d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_CLOSE; 504d027880SJerin Jacob hdr.vfid = port; 514d027880SJerin Jacob 52d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 534d027880SJerin Jacob if (res < 0) 544d027880SJerin Jacob return -EACCES; 554d027880SJerin Jacob 564d027880SJerin Jacob return res; 574d027880SJerin Jacob } 584d027880SJerin Jacob 594d027880SJerin Jacob int 604d027880SJerin Jacob octeontx_bgx_port_start(int port) 614d027880SJerin Jacob { 624d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 634d027880SJerin Jacob int res; 644d027880SJerin Jacob 654d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 664d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_START; 674d027880SJerin Jacob hdr.vfid = port; 684d027880SJerin Jacob 69d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 704d027880SJerin Jacob if (res < 0) 714d027880SJerin Jacob return -EACCES; 724d027880SJerin Jacob 734d027880SJerin Jacob return res; 744d027880SJerin Jacob } 754d027880SJerin Jacob 764d027880SJerin Jacob int 774d027880SJerin Jacob octeontx_bgx_port_stop(int port) 784d027880SJerin Jacob { 794d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 804d027880SJerin Jacob int res; 814d027880SJerin Jacob 824d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 834d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_STOP; 844d027880SJerin Jacob hdr.vfid = port; 854d027880SJerin Jacob 86d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 874d027880SJerin Jacob if (res < 0) 884d027880SJerin Jacob return -EACCES; 894d027880SJerin Jacob 904d027880SJerin Jacob return res; 914d027880SJerin Jacob } 92e242dd1cSJerin Jacob 93e242dd1cSJerin Jacob int 94e242dd1cSJerin Jacob octeontx_bgx_port_get_config(int port, octeontx_mbox_bgx_port_conf_t *conf) 95e242dd1cSJerin Jacob { 96e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 97e242dd1cSJerin Jacob octeontx_mbox_bgx_port_conf_t bgx_conf; 98e242dd1cSJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_conf_t); 99e242dd1cSJerin Jacob int res; 100e242dd1cSJerin Jacob 101e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 102e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_CONFIG; 103e242dd1cSJerin Jacob hdr.vfid = port; 104e242dd1cSJerin Jacob 105e242dd1cSJerin Jacob memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t)); 106d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len); 107e242dd1cSJerin Jacob if (res < 0) 108e242dd1cSJerin Jacob return -EACCES; 109e242dd1cSJerin Jacob 110e242dd1cSJerin Jacob conf->enable = bgx_conf.enable; 111e242dd1cSJerin Jacob conf->promisc = bgx_conf.promisc; 112e242dd1cSJerin Jacob conf->bpen = bgx_conf.bpen; 113e242dd1cSJerin Jacob conf->node = bgx_conf.node; 114e242dd1cSJerin Jacob conf->base_chan = bgx_conf.base_chan; 115e242dd1cSJerin Jacob conf->num_chans = bgx_conf.num_chans; 116e242dd1cSJerin Jacob conf->mtu = bgx_conf.mtu; 117e242dd1cSJerin Jacob conf->bgx = bgx_conf.bgx; 118e242dd1cSJerin Jacob conf->lmac = bgx_conf.lmac; 119e242dd1cSJerin Jacob conf->mode = bgx_conf.mode; 120e242dd1cSJerin Jacob conf->pkind = bgx_conf.pkind; 121e242dd1cSJerin Jacob memcpy(conf->macaddr, bgx_conf.macaddr, 6); 122e242dd1cSJerin Jacob 123e242dd1cSJerin Jacob return res; 124e242dd1cSJerin Jacob } 125e242dd1cSJerin Jacob 126e242dd1cSJerin Jacob int 127e242dd1cSJerin Jacob octeontx_bgx_port_status(int port, octeontx_mbox_bgx_port_status_t *stat) 128e242dd1cSJerin Jacob { 129e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 130e242dd1cSJerin Jacob octeontx_mbox_bgx_port_status_t bgx_stat; 131e242dd1cSJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_status_t); 132e242dd1cSJerin Jacob int res; 133e242dd1cSJerin Jacob 134e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 135e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_STATUS; 136e242dd1cSJerin Jacob hdr.vfid = port; 137e242dd1cSJerin Jacob 138d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stat, len); 139e242dd1cSJerin Jacob if (res < 0) 140e242dd1cSJerin Jacob return -EACCES; 141e242dd1cSJerin Jacob 142e242dd1cSJerin Jacob stat->link_up = bgx_stat.link_up; 143e242dd1cSJerin Jacob 144e242dd1cSJerin Jacob return res; 145e242dd1cSJerin Jacob } 146e242dd1cSJerin Jacob 147e242dd1cSJerin Jacob int 148*c6b97d67SHarman Kalra octeontx_bgx_port_xstats(int port, octeontx_mbox_bgx_port_stats_t *stats) 149*c6b97d67SHarman Kalra { 150*c6b97d67SHarman Kalra struct octeontx_mbox_hdr hdr; 151*c6b97d67SHarman Kalra int len = sizeof(octeontx_mbox_bgx_port_stats_t); 152*c6b97d67SHarman Kalra int res; 153*c6b97d67SHarman Kalra 154*c6b97d67SHarman Kalra hdr.coproc = OCTEONTX_BGX_COPROC; 155*c6b97d67SHarman Kalra hdr.msg = MBOX_BGX_PORT_GET_STATS; 156*c6b97d67SHarman Kalra hdr.vfid = port; 157*c6b97d67SHarman Kalra 158*c6b97d67SHarman Kalra res = octeontx_mbox_send(&hdr, NULL, 0, stats, len); 159*c6b97d67SHarman Kalra if (res < 0) 160*c6b97d67SHarman Kalra return -EACCES; 161*c6b97d67SHarman Kalra return res; 162*c6b97d67SHarman Kalra } 163*c6b97d67SHarman Kalra 164*c6b97d67SHarman Kalra int 165e242dd1cSJerin Jacob octeontx_bgx_port_stats(int port, octeontx_mbox_bgx_port_stats_t *stats) 166e242dd1cSJerin Jacob { 167e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 168e242dd1cSJerin Jacob octeontx_mbox_bgx_port_stats_t bgx_stats; 169e242dd1cSJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_stats_t); 170e242dd1cSJerin Jacob int res; 171e242dd1cSJerin Jacob 172e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 173e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_STATS; 174e242dd1cSJerin Jacob hdr.vfid = port; 175e242dd1cSJerin Jacob 176d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stats, len); 177e242dd1cSJerin Jacob if (res < 0) 178e242dd1cSJerin Jacob return -EACCES; 179e242dd1cSJerin Jacob 180e242dd1cSJerin Jacob stats->rx_packets = bgx_stats.rx_packets; 181e242dd1cSJerin Jacob stats->rx_bytes = bgx_stats.rx_bytes; 182e242dd1cSJerin Jacob stats->rx_dropped = bgx_stats.rx_dropped; 183e242dd1cSJerin Jacob stats->rx_errors = bgx_stats.rx_errors; 184e242dd1cSJerin Jacob stats->tx_packets = bgx_stats.tx_packets; 185e242dd1cSJerin Jacob stats->tx_bytes = bgx_stats.tx_bytes; 186e242dd1cSJerin Jacob stats->tx_dropped = bgx_stats.tx_dropped; 187e242dd1cSJerin Jacob stats->tx_errors = bgx_stats.tx_errors; 188e242dd1cSJerin Jacob return res; 189e242dd1cSJerin Jacob } 190e242dd1cSJerin Jacob 191e242dd1cSJerin Jacob int 192e242dd1cSJerin Jacob octeontx_bgx_port_stats_clr(int port) 193e242dd1cSJerin Jacob { 194e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 195e242dd1cSJerin Jacob int res; 196e242dd1cSJerin Jacob 197e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 198e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_CLR_STATS; 199e242dd1cSJerin Jacob hdr.vfid = port; 200e242dd1cSJerin Jacob 201d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 202e242dd1cSJerin Jacob if (res < 0) 203e242dd1cSJerin Jacob return -EACCES; 204e242dd1cSJerin Jacob 205e242dd1cSJerin Jacob return res; 206e242dd1cSJerin Jacob } 207e242dd1cSJerin Jacob 208e242dd1cSJerin Jacob int 209e242dd1cSJerin Jacob octeontx_bgx_port_link_status(int port) 210e242dd1cSJerin Jacob { 211e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 212e242dd1cSJerin Jacob uint8_t link; 213e242dd1cSJerin Jacob int len = sizeof(uint8_t); 214e242dd1cSJerin Jacob int res; 215e242dd1cSJerin Jacob 216e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 217e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_LINK_STATUS; 218e242dd1cSJerin Jacob hdr.vfid = port; 219e242dd1cSJerin Jacob 220d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &link, len); 221e242dd1cSJerin Jacob if (res < 0) 222e242dd1cSJerin Jacob return -EACCES; 223e242dd1cSJerin Jacob 224e242dd1cSJerin Jacob return link; 225e242dd1cSJerin Jacob } 226e242dd1cSJerin Jacob 227e242dd1cSJerin Jacob int 2288b42b07eSHarman Kalra octeontx_bgx_port_set_link_state(int port, bool enable) 2298b42b07eSHarman Kalra { 2308b42b07eSHarman Kalra struct octeontx_mbox_hdr hdr; 2318b42b07eSHarman Kalra 2328b42b07eSHarman Kalra hdr.coproc = OCTEONTX_BGX_COPROC; 2338b42b07eSHarman Kalra hdr.msg = MBOX_BGX_PORT_SET_LINK_STATE; 2348b42b07eSHarman Kalra hdr.vfid = port; 2358b42b07eSHarman Kalra 2368b42b07eSHarman Kalra return octeontx_mbox_send(&hdr, &enable, sizeof(bool), NULL, 0); 2378b42b07eSHarman Kalra } 2388b42b07eSHarman Kalra 2398b42b07eSHarman Kalra int 240e242dd1cSJerin Jacob octeontx_bgx_port_promisc_set(int port, int en) 241e242dd1cSJerin Jacob { 242e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 243e242dd1cSJerin Jacob uint8_t prom; 244e242dd1cSJerin Jacob int res; 245e242dd1cSJerin Jacob 246e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 247e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_SET_PROMISC; 248e242dd1cSJerin Jacob hdr.vfid = port; 249e242dd1cSJerin Jacob prom = en ? 1 : 0; 250e242dd1cSJerin Jacob 251d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &prom, sizeof(prom), NULL, 0); 252e242dd1cSJerin Jacob if (res < 0) 253e242dd1cSJerin Jacob return -EACCES; 254e242dd1cSJerin Jacob 255e242dd1cSJerin Jacob return res; 256e242dd1cSJerin Jacob } 257e242dd1cSJerin Jacob 258e242dd1cSJerin Jacob int 2593151e6a6SHarman Kalra octeontx_bgx_port_mtu_set(int port, int mtu) 2603151e6a6SHarman Kalra { 2613151e6a6SHarman Kalra struct octeontx_mbox_hdr hdr; 2623151e6a6SHarman Kalra int res; 2633151e6a6SHarman Kalra 2643151e6a6SHarman Kalra hdr.coproc = OCTEONTX_BGX_COPROC; 2653151e6a6SHarman Kalra hdr.msg = MBOX_BGX_PORT_SET_MTU; 2663151e6a6SHarman Kalra hdr.vfid = port; 2673151e6a6SHarman Kalra 2683151e6a6SHarman Kalra res = octeontx_mbox_send(&hdr, &mtu, sizeof(mtu), NULL, 0); 2693151e6a6SHarman Kalra if (res < 0) 2703151e6a6SHarman Kalra return -EACCES; 2713151e6a6SHarman Kalra 2723151e6a6SHarman Kalra return res; 2733151e6a6SHarman Kalra } 2743151e6a6SHarman Kalra 2753151e6a6SHarman Kalra int 276e242dd1cSJerin Jacob octeontx_bgx_port_mac_set(int port, uint8_t *mac_addr) 277e242dd1cSJerin Jacob { 278e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 279e242dd1cSJerin Jacob int len = 6; 280e242dd1cSJerin Jacob int res = 0; 281e242dd1cSJerin Jacob 282e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 283e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_SET_MACADDR; 284e242dd1cSJerin Jacob hdr.vfid = port; 285e242dd1cSJerin Jacob 286d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, mac_addr, len, NULL, 0); 287e242dd1cSJerin Jacob if (res < 0) 288e242dd1cSJerin Jacob return -EACCES; 289e242dd1cSJerin Jacob 290e242dd1cSJerin Jacob return res; 291e242dd1cSJerin Jacob } 292e4373bf1SSunil Kumar Kori 293e4373bf1SSunil Kumar Kori int 2949614459bSSunil Kumar Kori octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr, int index) 295e4373bf1SSunil Kumar Kori { 2969614459bSSunil Kumar Kori struct octeontx_mbox_bgx_port_mac_filter filter; 297e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 298e4373bf1SSunil Kumar Kori int len = 6; 299e4373bf1SSunil Kumar Kori 300e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 301e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_ADD_MACADDR; 302e4373bf1SSunil Kumar Kori hdr.vfid = port; 303e4373bf1SSunil Kumar Kori 3049614459bSSunil Kumar Kori memcpy(filter.mac_addr, mac_addr, len); 3059614459bSSunil Kumar Kori filter.index = index; 3069614459bSSunil Kumar Kori len = sizeof(struct octeontx_mbox_bgx_port_mac_filter); 307e4373bf1SSunil Kumar Kori 3089614459bSSunil Kumar Kori return octeontx_mbox_send(&hdr, &filter, len, NULL, 0); 309e4373bf1SSunil Kumar Kori } 310e4373bf1SSunil Kumar Kori 311e4373bf1SSunil Kumar Kori int 312e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_del(int port, uint32_t index) 313e4373bf1SSunil Kumar Kori { 314e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 315e4373bf1SSunil Kumar Kori int len = sizeof(uint32_t); 316e4373bf1SSunil Kumar Kori int res = 0; 317e4373bf1SSunil Kumar Kori 318e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 319e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_DEL_MACADDR; 320e4373bf1SSunil Kumar Kori hdr.vfid = port; 321e4373bf1SSunil Kumar Kori 322e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, &index, len, NULL, 0); 323e4373bf1SSunil Kumar Kori if (res < 0) 324e4373bf1SSunil Kumar Kori return -EACCES; 325e4373bf1SSunil Kumar Kori 326e4373bf1SSunil Kumar Kori return res; 327e4373bf1SSunil Kumar Kori } 328e4373bf1SSunil Kumar Kori 329e4373bf1SSunil Kumar Kori int 330e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_entries_get(int port) 331e4373bf1SSunil Kumar Kori { 332e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 333e4373bf1SSunil Kumar Kori int resp = 6; 334e4373bf1SSunil Kumar Kori int res = 0; 335e4373bf1SSunil Kumar Kori 336e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 337e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_GET_MACADDR_ENTRIES; 338e4373bf1SSunil Kumar Kori hdr.vfid = port; 339e4373bf1SSunil Kumar Kori 340e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, NULL, 0, &resp, sizeof(int)); 341e4373bf1SSunil Kumar Kori if (res < 0) 342e4373bf1SSunil Kumar Kori return -EACCES; 343e4373bf1SSunil Kumar Kori 344e4373bf1SSunil Kumar Kori return resp; 345e4373bf1SSunil Kumar Kori } 346241a6500SVamsi Attunuru 347241a6500SVamsi Attunuru int octeontx_bgx_port_get_fifo_cfg(int port, 348241a6500SVamsi Attunuru octeontx_mbox_bgx_port_fifo_cfg_t *cfg) 349241a6500SVamsi Attunuru { 350241a6500SVamsi Attunuru int len = sizeof(octeontx_mbox_bgx_port_fifo_cfg_t); 351241a6500SVamsi Attunuru octeontx_mbox_bgx_port_fifo_cfg_t conf; 352241a6500SVamsi Attunuru struct octeontx_mbox_hdr hdr; 353241a6500SVamsi Attunuru 354241a6500SVamsi Attunuru hdr.coproc = OCTEONTX_BGX_COPROC; 355241a6500SVamsi Attunuru hdr.msg = MBOX_BGX_PORT_GET_FIFO_CFG; 356241a6500SVamsi Attunuru hdr.vfid = port; 357241a6500SVamsi Attunuru 358241a6500SVamsi Attunuru if (octeontx_mbox_send(&hdr, NULL, 0, &conf, len) < 0) 359241a6500SVamsi Attunuru return -EACCES; 360241a6500SVamsi Attunuru 361241a6500SVamsi Attunuru cfg->rx_fifosz = conf.rx_fifosz; 362241a6500SVamsi Attunuru 363241a6500SVamsi Attunuru return 0; 364241a6500SVamsi Attunuru } 365241a6500SVamsi Attunuru 366241a6500SVamsi Attunuru int octeontx_bgx_port_flow_ctrl_cfg(int port, 367241a6500SVamsi Attunuru octeontx_mbox_bgx_port_fc_cfg_t *cfg) 368241a6500SVamsi Attunuru { 369241a6500SVamsi Attunuru int len = sizeof(octeontx_mbox_bgx_port_fc_cfg_t); 370241a6500SVamsi Attunuru octeontx_mbox_bgx_port_fc_cfg_t conf; 371241a6500SVamsi Attunuru struct octeontx_mbox_hdr hdr; 372241a6500SVamsi Attunuru 373241a6500SVamsi Attunuru hdr.coproc = OCTEONTX_BGX_COPROC; 374241a6500SVamsi Attunuru hdr.msg = MBOX_BGX_PORT_FLOW_CTRL_CFG; 375241a6500SVamsi Attunuru hdr.vfid = port; 376241a6500SVamsi Attunuru 377241a6500SVamsi Attunuru if (cfg->fc_cfg == BGX_PORT_FC_CFG_SET) 378241a6500SVamsi Attunuru memcpy(&conf, cfg, len); 379241a6500SVamsi Attunuru else 380241a6500SVamsi Attunuru memset(&conf, 0, len); 381241a6500SVamsi Attunuru 382241a6500SVamsi Attunuru if (octeontx_mbox_send(&hdr, &conf, len, &conf, len) < 0) 383241a6500SVamsi Attunuru return -EACCES; 384241a6500SVamsi Attunuru 385241a6500SVamsi Attunuru if (cfg->fc_cfg == BGX_PORT_FC_CFG_SET) 386241a6500SVamsi Attunuru goto done; 387241a6500SVamsi Attunuru 388241a6500SVamsi Attunuru cfg->rx_pause = conf.rx_pause; 389241a6500SVamsi Attunuru cfg->tx_pause = conf.tx_pause; 390241a6500SVamsi Attunuru cfg->low_water = conf.low_water; 391241a6500SVamsi Attunuru cfg->high_water = conf.high_water; 392241a6500SVamsi Attunuru 393241a6500SVamsi Attunuru done: 394241a6500SVamsi Attunuru return 0; 395241a6500SVamsi Attunuru } 396a84ff1d9SHarman Kalra 397a84ff1d9SHarman Kalra int octeontx_bgx_port_change_mode(int port, 398a84ff1d9SHarman Kalra octeontx_mbox_bgx_port_change_mode_t *cfg) 399a84ff1d9SHarman Kalra { 400a84ff1d9SHarman Kalra int len = sizeof(octeontx_mbox_bgx_port_change_mode_t), res; 401a84ff1d9SHarman Kalra octeontx_mbox_bgx_port_change_mode_t conf; 402a84ff1d9SHarman Kalra struct octeontx_mbox_hdr hdr; 403a84ff1d9SHarman Kalra 404a84ff1d9SHarman Kalra hdr.coproc = OCTEONTX_BGX_COPROC; 405a84ff1d9SHarman Kalra hdr.msg = MBOX_BGX_PORT_CHANGE_MODE; 406a84ff1d9SHarman Kalra hdr.vfid = port; 407a84ff1d9SHarman Kalra 408a84ff1d9SHarman Kalra memcpy(&conf, cfg, len); 409a84ff1d9SHarman Kalra res = octeontx_mbox_send(&hdr, &conf, len, NULL, 0); 410a84ff1d9SHarman Kalra if (res < 0) 411a84ff1d9SHarman Kalra return -EACCES; 412a84ff1d9SHarman Kalra 413a84ff1d9SHarman Kalra return res; 414a84ff1d9SHarman Kalra } 415