4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/* Copyright © 2003-2011 Emulex. All rights reserved. */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Source file containing the implementation of MBOX
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and related helper functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_impl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_dma_attr_t oce_sgl_dma_attr = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DMA_ATTR_V0, /* version number */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x0000000000000000ull, /* low address */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0xFFFFFFFFFFFFFFFFull, /* high address */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x0000000000010000ull, /* dma counter max */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x1000, /* alignment 4K for mbx bufs */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x1, /* burst sizes */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000004, /* minimum transfer size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000000FFFFFFFFull, /* maximum transfer size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0xFFFFFFFFFFFFFFFFull, /* maximum segment size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MAX_MBX_SGE, /* scatter/gather list length */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000001, /* granularity */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0 /* DMA flags */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_device_acc_attr_t oce_sgl_buf_accattr = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DEVICE_ATTR_V0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_NEVERSWAP_ACC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_STRICTORDER_ACC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * common inline function to fill an ioctl request header
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * hdr - pointer to a buffer where the header will be initialized
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dom - domain
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * port - port number
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * opcode - command code for this MBX
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * timeout - timeout in seconds
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * pyld_len - length of the command buffer described by this header
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return none
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanmbx_common_req_hdr_init(struct mbx_hdr *hdr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint8_t dom, uint8_t port,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint8_t subsys, uint8_t opcode,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t timeout, uint32_t pyld_len)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(hdr != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr->u0.req.opcode = opcode;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr->u0.req.subsystem = subsys;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr->u0.req.port_number = port;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr->u0.req.domain = dom;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr->u0.req.timeout = timeout;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr->u0.req.request_length = pyld_len - sizeof (struct mbx_hdr);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan hdr->u0.req.rsvd0 = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* mbx_common_req_hdr_init */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to initialize the hw with host endian information
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, ETIMEDOUT on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_mbox_init(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_bmbx *mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint8_t *ptr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(dev != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx = (struct oce_bmbx *)DBUF_VA(dev->bmbx);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ptr = (uint8_t *)&mbx->mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Endian Signature */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0xff;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0x12;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0x34;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0xff;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0xff;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0x56;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr++ = 0x78;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *ptr = 0xff;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_dispatch(dev, 0);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != 0)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to set endian %d", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_mbox_init */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to wait till we get a mbox ready after writing to the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mbox doorbell
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0=ready, ETIMEDOUT=>not ready but timed out
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_mbox_wait(struct oce_dev *dev, uint32_t tmo_sec)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan clock_t tmo;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t now, tstamp;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pd_mpu_mbox_db_t mbox_db;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan tmo = (tmo_sec > 0) ? drv_usectohz(tmo_sec * 1000000) :
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan drv_usectohz(DEFAULT_MQ_MBOX_TIMEOUT);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore /* Add the default timeout to wait for a mailbox to complete */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore tmo += drv_usectohz(MBX_READY_TIMEOUT);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tstamp = ddi_get_lbolt();
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan for (;;) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan now = ddi_get_lbolt();
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if ((now - tstamp) >= tmo) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tmo = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.dw0 = OCE_DB_READ32(dev, PD_MPU_MBOX_DB);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->db_handle) != DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan oce_fm_ereport(dev, DDI_FM_DEVICE_INVAL_STATE);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (mbox_db.bits.ready) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan return (0);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan drv_usecwait(5);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan return (ETIMEDOUT);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_mbox_wait */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to dispatch a mailbox command present in the mq mbox
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, ETIMEDOUT on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_mbox_dispatch(struct oce_dev *dev, uint32_t tmo_sec)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pd_mpu_mbox_db_t mbox_db;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t pa;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan /* sync the bmbx */
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan (void) DBUF_SYNC(dev->bmbx, DDI_DMA_SYNC_FORDEV);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* write 30 bits of address hi dword */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pa = (uint32_t)(DBUF_PA(dev->bmbx) >> 34);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan bzero(&mbox_db, sizeof (pd_mpu_mbox_db_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.bits.ready = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.bits.hi = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.bits.address = pa;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* wait for mbox ready */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_wait(dev, tmo_sec);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* ring the doorbell */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_DB_WRITE32(dev, PD_MPU_MBOX_DB, mbox_db.dw0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->db_handle) != DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* wait for mbox ready */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_wait(dev, tmo_sec);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "BMBX TIMED OUT PROGRAMMING HI ADDR: %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* if mbx times out, hw is in invalid state */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_fm_ereport(dev, DDI_FM_DEVICE_INVAL_STATE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now write 30 bits of address lo dword */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pa = (uint32_t)(DBUF_PA(dev->bmbx) >> 4) & 0x3fffffff;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.bits.ready = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.bits.hi = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbox_db.bits.address = pa;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* ring the doorbell */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_DB_WRITE32(dev, PD_MPU_MBOX_DB, mbox_db.dw0);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->db_handle) != DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* wait for mbox ready */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_wait(dev, tmo_sec);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan /* sync */
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan (void) ddi_dma_sync(DBUF_DHDL(dev->bmbx), 0, 0,
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_dma_handle(dev, DBUF_DHDL(dev->bmbx)) != DDI_FM_OK) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_mbox_dispatch */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to post a MBX to the mbox
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mbx - pointer to the MBX to send
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mbxctx - pointer to the mbx context structure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, ETIMEDOUT on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_mbox_post(struct oce_dev *dev, struct oce_mbx *mbx,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx_ctx *mbxctx)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx *mb_mbx = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mq_cqe *mb_cqe = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_bmbx *mb = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t tmo = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&dev->bmbx_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mb = (struct oce_bmbx *)DBUF_VA(dev->bmbx);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mb_mbx = &mb->mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the tmo */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tmo = mbx->tag[0];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx->tag[0] = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* copy mbx into mbox */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(mbx, mb_mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now dispatch */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_dispatch(dev, tmo);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != 0) {
965eec0d6b2b8d25b75f15294008c17159bf852bSukumar Swaminathan mutex_exit(&dev->bmbx_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* sync */
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_sync(DBUF_DHDL(dev->bmbx), 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_fm_check_dma_handle(dev, DBUF_DHDL(dev->bmbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_FM_OK) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->bmbx_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * the command completed successfully. Now get the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * completion queue entry
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mb_cqe = &mb->cqe;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mb_cqe->u0.dw[0]), sizeof (struct oce_mq_cqe));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore /* copy mbox mbx back */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore bcopy(mb_mbx, mbx, sizeof (struct oce_mbx));
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* check mbox status */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (mb_cqe->u0.s.completion_status != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "MBOX Command Failed with Status: %d %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mb_cqe->u0.s.completion_status,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mb_cqe->u0.s.extended_status);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->bmbx_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * store the mbx context in the cqe tag section so that
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * the upper layer handling the cqe can associate the mbx
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * with the response
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (mbxctx) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* save context */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbxctx->mbx = mb_mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(&mbxctx, mb_cqe->u0.s.mq_tag,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct oce_mbx_ctx *));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->bmbx_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_mbox_post */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to get the firmware version
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_get_fw_version(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_get_common_fw_version *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_get_common_fw_version *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_GET_COMMON_FW_VERSION,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_get_common_fw_version));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_get_common_fw_version);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(fwcmd->params.rsp.fw_ver_str, dev->fw_version, 32);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s %s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.fw_ver_str,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.fw_on_flash_ver_str);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_get_fw_version */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to invoke f/w reset via. mailbox
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * does not hold bootstap lock called by quiesce
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, ETIMEDOUT on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_reset_fun(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx *mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_bmbx *mb;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct ioctl_common_function_reset *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mb = (struct oce_bmbx *)DBUF_VA(dev->bmbx);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx = &mb->mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct ioctl_common_function_reset *)&mbx->payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_COMMON_FUNCTION_RESET,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct ioctl_common_function_reset));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx->u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx->payload_length = sizeof (struct ioctl_common_function_reset);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan DW_SWAP(u32ptr(mbx), mbx->payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (oce_mbox_dispatch(dev, 0));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_reset_fun */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to read the mac address associated with an interface
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * if_id - interface id to read the address from
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * perm - set to 1 if reading the factory mac address. In this case
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * if_id is ignored
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * type - type of the mac address, whether network or storage
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mac - [OUTPUT] pointer to a buffer containing the mac address
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * when the command succeeds
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_read_mac_addr(struct oce_dev *dev, uint32_t if_id, uint8_t perm,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint8_t type, struct mac_address_format *mac)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_query_common_iface_mac *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_query_common_iface_mac *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_QUERY_COMMON_IFACE_MAC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_query_common_iface_mac));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.permanent = perm;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (perm)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan fwcmd->params.req.if_id = (uint16_t)if_id;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.if_id = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.type = type;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_query_common_iface_mac);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the response */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "MAC addr size = 0x%x",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan LE_16(fwcmd->params.rsp.mac.size_of_struct));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "MAC_ADDR:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.mac.mac_addr[0],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.mac.mac_addr[1],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.mac.mac_addr[2],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.mac.mac_addr[3],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.mac.mac_addr[4],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.rsp.mac.mac_addr[5]);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* copy the mac addres in the output parameter */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->size_of_struct = LE_16(fwcmd->params.rsp.mac.size_of_struct);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(&fwcmd->params.rsp.mac.mac_addr[0], &mac->mac_addr[0],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->size_of_struct);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_read_mac_addr */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to create an interface using the OPCODE_CREATE_COMMON_IFACE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * command
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * cap_flags - capability flags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * en_flags - enable capability flags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * vlan_tag - optional vlan tag to associate with the if
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mac_addr - pointer to a buffer containing the mac address
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * if_id - [OUTPUT] pointer to an integer to hold the ID of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * interface created
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_if_create(struct oce_dev *dev, uint32_t cap_flags, uint32_t en_flags,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint16_t vlan_tag, uint8_t *mac_addr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t *if_id)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_create_common_iface *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_create_common_iface *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_CREATE_COMMON_IFACE,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_create_common_iface));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&fwcmd->hdr), sizeof (struct mbx_hdr));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.version = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.cap_flags = LE_32(cap_flags);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.enable_flags = LE_32(en_flags);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (mac_addr != NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(mac_addr, &fwcmd->params.req.mac_addr[0],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ETHERADDRL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.vlan_tag.u0.normal.vtag = LE_16(vlan_tag);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.mac_invalid = B_FALSE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.mac_invalid = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_create_common_iface);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get response */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *if_id = LE_32(fwcmd->params.rsp.if_id);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "IF_ID = 0x%x", *if_id);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* If asked to set mac addr save the pmac handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (mac_addr != NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->pmac_id = LE_32(fwcmd->params.rsp.pmac_id);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "PMAC_ID = 0x%x", dev->pmac_id);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_if_create */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to delete an interface
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * if_id - ID of the interface to delete
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_if_del(struct oce_dev *dev, uint32_t if_id)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_destroy_common_iface *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_destroy_common_iface *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_DESTROY_COMMON_IFACE,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_destroy_common_iface));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.if_id = if_id;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_destroy_common_iface);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_if_del */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to query the link status from the hardware
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * link_status - [OUT] pointer to the structure returning the link attributes
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_get_link_status(struct oce_dev *dev, struct link_status *link)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_query_common_link_status *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_query_common_link_status *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_QUERY_COMMON_LINK_STATUS,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_query_common_link_status));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_query_common_link_status);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* interpret response */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan bcopy(&fwcmd->params.rsp, link, sizeof (struct link_status));
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan link->logical_link_status = LE_32(link->logical_link_status);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan link->qos_link_speed = LE_16(link->qos_link_speed);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_get_link_status */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to configure the rx filter on the interface
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * filter - mbx command containing the filter parameters
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_set_rx_filter(struct oce_dev *dev,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_set_common_ntwk_rx_filter *filter)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_set_common_ntwk_rx_filter *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_set_common_ntwk_rx_filter *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(filter, fwcmd, sizeof (struct mbx_set_common_ntwk_rx_filter));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_COMMON_NTWK_RX_FILTER,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_set_common_ntwk_rx_filter));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_set_common_ntwk_rx_filter);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_set_rx_filter */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to send the mbx command to update the mcast table with fw
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mca_table - array of mcast address to update
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mca_cnt - number of elements in mca_table
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * enable_promisc - flag to enable/disable mcast-promiscuous mode
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_set_multicast_table(struct oce_dev *dev, uint32_t if_id,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanstruct ether_addr *mca_table, uint16_t mca_cnt, boolean_t promisc)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_set_common_iface_multicast *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_set_common_iface_multicast *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_SET_COMMON_IFACE_MULTICAST,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_set_common_iface_multicast));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the command */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan fwcmd->params.req.if_id = (uint8_t)if_id;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (mca_table != NULL) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan bcopy(mca_table, &fwcmd->params.req.mac[0],
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan mca_cnt * ETHERADDRL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.num_mac = LE_16(mca_cnt);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan fwcmd->params.req.promiscuous = (uint8_t)promisc;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_set_common_iface_multicast);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Swap only MBX header + BOOTSTRAP HDR */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), (OCE_BMBX_RHDR_SZ + OCE_MBX_RRHDR_SZ));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_set_multicast_table */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to query the fw attributes from the hw
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_get_fw_config(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_query_fw_config *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_common_query_fw_config *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_QUERY_COMMON_FIRMWARE_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_query_fw_config));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_common_query_fw_config);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* swap and copy into buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(fwcmd), sizeof (struct mbx_common_query_fw_config));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->config_number = fwcmd->params.rsp.config_number;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->asic_revision = fwcmd->params.rsp.asic_revision;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->port_id = fwcmd->params.rsp.port_id;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->function_mode = fwcmd->params.rsp.function_mode;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* get the max rings alloted for this function */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (fwcmd->params.rsp.ulp[0].mode & ULP_NIC_MODE) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->max_tx_rings = fwcmd->params.rsp.ulp[0].wq_count;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->max_rx_rings = fwcmd->params.rsp.ulp[0].rq_count;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan } else {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->max_tx_rings = fwcmd->params.rsp.ulp[1].wq_count;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->max_rx_rings = fwcmd->params.rsp.ulp[1].rq_count;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->function_caps = fwcmd->params.rsp.function_caps;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_get_fw_config */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to retrieve statistic counters from the hardware
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_get_hw_stats(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_get_nic_stats *fwcmd = dev->hw_stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_NIC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_GET_NIC_STATS,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_get_nic_stats));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(fwcmd), sizeof (struct mbx_get_nic_stats));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[0].pa_lo = ADDR_LO(DBUF_PA(dev->stats_dbuf));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[0].pa_hi = ADDR_HI(DBUF_PA(dev->stats_dbuf));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[0].length = sizeof (struct mbx_get_nic_stats);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_get_nic_stats);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.sge_count = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), sizeof (struct oce_mq_sge) + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore bzero(&dev->hw_stats->params, sizeof (dev->hw_stats->params));
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan /* sync for device */
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan (void) DBUF_SYNC(dev->stats_dbuf, DDI_DMA_SYNC_FORDEV);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan /* sync the stats */
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan (void) DBUF_SYNC(dev->stats_dbuf, DDI_DMA_SYNC_FORKERNEL);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Check the mailbox status and command completion status */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(dev->hw_stats), sizeof (struct mbx_get_nic_stats));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_get_hw_stats */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to set the number of vectors with the cev
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * num_vectors - number of MSI messages
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_num_intr_vectors_set(struct oce_dev *dev, uint32_t num_vectors)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_cev_modify_msi_messages *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_common_cev_modify_msi_messages *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_COMMON_CEV_MODIFY_MSI_MESSAGES,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_cev_modify_msi_messages));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.num_msi_msgs = LE_32(num_vectors);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_cev_modify_msi_messages);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_num_intr_vectors_set */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to set flow control capability in the hardware
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * flow_control - flow control flags to set
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_set_flow_control(struct oce_dev *dev, uint32_t flow_control)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_get_set_flow_control *fwcmd =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (struct mbx_common_get_set_flow_control *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_SET_COMMON_FLOW_CONTROL,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_get_set_flow_control));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (flow_control & OCE_FC_TX)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->tx_flow_control = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (flow_control & OCE_FC_RX)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->rx_flow_control = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_common_get_set_flow_control);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_set_flow_control */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to get the current flow control setting with the hardware
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * flow_control - [OUT] pointer to location where flow_control setting
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * is returned
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_get_flow_control(struct oce_dev *dev, uint32_t *flow_control)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_get_set_flow_control *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DEV_LOCK(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->suspended) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DEV_UNLOCK(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DEV_UNLOCK(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_common_get_set_flow_control *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_GET_COMMON_FLOW_CONTROL,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_get_set_flow_control));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_common_get_set_flow_control);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the flow control */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(fwcmd),
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_get_set_flow_control));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *flow_control = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (fwcmd->tx_flow_control)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *flow_control |= OCE_FC_TX;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (fwcmd->rx_flow_control)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *flow_control |= OCE_FC_RX;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_get_flow_control */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to enable/disable device promiscuous mode
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * enable - enable/disable flag
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_set_promiscuous(struct oce_dev *dev, boolean_t enable)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_config_nic_promiscuous *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_config_nic_promiscuous *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->port_id == 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.port0_promisc = (uint8_t)enable;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.port1_promisc = (uint8_t)enable;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_NIC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_CONFIG_NIC_PROMISCUOUS,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_config_nic_promiscuous));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_config_nic_promiscuous);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to add a unicast address to an interface
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mac - unicast address
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_add_mac(struct oce_dev *dev, uint32_t if_id,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan const uint8_t *mac, uint32_t *pmac_id)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_add_common_iface_mac *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_add_common_iface_mac *)&mbx.payload;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan fwcmd->params.req.if_id = LE_32(if_id);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(mac, &fwcmd->params.req.mac_address[0], ETHERADDRL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_ADD_COMMON_IFACE_MAC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_add_common_iface_mac));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_add_common_iface_mac);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), OCE_BMBX_RHDR_SZ + OCE_MBX_RRHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *pmac_id = LE_32(fwcmd->params.rsp.pmac_id);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to delete an unicast address associated with an interface
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * pmac_id - handle to the address added using ace_add_mac
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_del_mac(struct oce_dev *dev, uint32_t if_id, uint32_t *pmac_id)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_del_common_iface_mac *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_del_common_iface_mac *)&mbx.payload;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan fwcmd->params.req.if_id = if_id;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.pmac_id = *pmac_id;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_DEL_COMMON_IFACE_MAC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_add_common_iface_mac));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_del_common_iface_mac);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to send the mbx command to configure vlan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * vtag_arr - array of vlan tags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * vtag_cnt - number of elements in array
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * untagged - boolean TRUE/FLASE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * enable_promisc - flag to enable/disable VLAN promiscuous mode
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_config_vlan(struct oce_dev *dev, uint32_t if_id,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct normal_vlan *vtag_arr, uint8_t vtag_cnt,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan boolean_t untagged, boolean_t enable_promisc)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_config_vlan *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_common_config_vlan *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_CONFIG_COMMON_IFACE_VLAN,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_config_vlan));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan fwcmd->params.req.if_id = (uint8_t)if_id;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.promisc = (uint8_t)enable_promisc;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.untagged = (uint8_t)untagged;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.num_vlans = vtag_cnt;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Set the vlan tag filter on hw */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (!enable_promisc) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(fwcmd->params.req.tags.normal_vlans, vtag_arr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan vtag_cnt * sizeof (struct normal_vlan));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_common_config_vlan);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), (OCE_BMBX_RHDR_SZ + mbx.payload_length));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_config_vlan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to enable or disable the link
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mca_table - array of mcast address to update
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mca_cnt - number of elements in mca_table
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * enable_promisc - flag to enable/disable mcast-promiscuous mode
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on success, EIO on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_config_link(struct oce_dev *dev, boolean_t enable)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_func_link_cfg *fwcmd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd = (struct mbx_common_func_link_cfg *)&mbx.payload;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the ioctl header */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_SUBSYSTEM_COMMON,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OPCODE_COMMON_FUNCTION_LINK_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBX_TIMEOUT_SEC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_common_config_vlan));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->params.req.enable = enable;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_common_func_link_cfg);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), (OCE_BMBX_RHDR_SZ + mbx.payload_length));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_config_link */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanint
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanoce_config_rss(struct oce_dev *dev, uint16_t if_id, char *hkey, char *itbl,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int tbl_sz, uint16_t rss_type, uint8_t flush)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan struct oce_mbx mbx;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan struct mbx_config_nic_rss *fwcmd;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int i;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int ret = 0;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fwcmd = (struct mbx_config_nic_rss *)&mbx.payload;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* initialize the ioctl header */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan MBX_SUBSYSTEM_NIC,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OPCODE_CONFIG_NIC_RSS,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan MBX_TIMEOUT_SEC,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan sizeof (struct mbx_config_nic_rss));
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fwcmd->params.req.enable_rss = LE_16(rss_type);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fwcmd->params.req.flush = flush;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fwcmd->params.req.if_id = LE_32(if_id);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (hkey != NULL) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan bcopy(hkey, fwcmd->params.req.hash, OCE_HKEY_SIZE);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* Fill the indirection table */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan for (i = 0; i < tbl_sz; i++) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fwcmd->params.req.cputable[i] = itbl[i];
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fwcmd->params.req.cpu_tbl_sz_log2 = LE_16(OCE_LOG2(tbl_sz));
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* fill rest of mbx */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan mbx.u0.s.embedded = B_TRUE;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan mbx.payload_length = sizeof (struct mbx_config_nic_rss);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), (OCE_BMBX_RHDR_SZ + OCE_MBX_RRHDR_SZ));
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* post the command */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (ret);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function called from the gld ioctl entry point to send a mbx to fw
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * mp - mblk_t containing the user data
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * payload_len = [OUT] pointer to return the length of the payload written
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return 0 on Success
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_issue_mbox(struct oce_dev *dev, queue_t *wq, mblk_t *mp,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t *payload_len)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_mbx mbx;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_hdr hdr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_handle_t dma_handle;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan boolean_t is_embedded = B_FALSE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t payload_length;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int num_buf = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int alloc_len;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan caddr_t sg_va;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_acc_handle_t acc_handle;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t actual_len;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan _NOTE(ARGUNUSED(wq));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(&mbx, sizeof (struct oce_mbx));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(mp->b_cont->b_rptr, &hdr, sizeof (struct mbx_hdr));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&hdr), sizeof (struct mbx_hdr));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan payload_length = hdr.u0.req.request_length +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_hdr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan is_embedded = (payload_length <= sizeof (struct oce_mbx_payload));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore alloc_len = msgdsize(mp->b_cont);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "Mailbox: "
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "DW[0] 0x%x DW[1] 0x%x DW[2]0x%x DW[3]0x%x,"
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "MBLKL(%lu) ALLOCLEN(%d)",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr.u0.dw[0], hdr.u0.dw[1],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr.u0.dw[2], hdr.u0.dw[3],
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBLKL(mp->b_cont), alloc_len);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore /* get the timeout from the command header */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore mbx.tag[0] = hdr.u0.req.timeout;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (hdr.u0.req.opcode == OPCODE_WRITE_COMMON_FLASHROM) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_read_write_flashrom *fwcmd =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (struct mbx_common_read_write_flashrom *)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mp->b_cont->b_rptr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->cookie != 0 && dev->cookie != hdr.u0.req.rsvd0)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EINVAL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->cookie == 0)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->cookie = hdr.u0.req.rsvd0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan hdr.u0.req.rsvd0 = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "Mailbox params:"
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "OPCODE(%d) OPTYPE = %d SIZE = %d OFFSET = %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->flash_op_code, fwcmd->flash_op_type,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan fwcmd->data_buffer_size, fwcmd->data_offset);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (!is_embedded) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore mblk_t *tmp = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_cookie_t cookie;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t count = 0;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore int offset = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate dma handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_alloc_handle(dev->dip,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &oce_sgl_dma_attr, DDI_DMA_DONTWAIT, NULL,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to alloc DMA handle");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ENOMEM;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the DMA-able memory */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_mem_alloc(dma_handle, alloc_len,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &oce_sgl_buf_accattr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_DONTWAIT,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, &sg_va, &actual_len, &acc_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to alloc DMA memory");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ENOMEM;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto dma_alloc_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore for (tmp = mp->b_cont; tmp != NULL; tmp = tmp->b_cont) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore bcopy((caddr_t)tmp->b_rptr, sg_va + offset, MBLKL(tmp));
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore offset += MBLKL(tmp);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* bind mblk mem to handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_addr_bind_handle(
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dma_handle,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (struct as *)0, sg_va,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore alloc_len,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_DONTWAIT, NULL, &cookie, &count);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_DMA_MAPPED) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ENOMEM;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to bind DMA handle ret code: %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto dma_bind_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan for (num_buf = 0; num_buf < count; num_buf++) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the mbx sglist */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[num_buf].pa_lo =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ADDR_LO(cookie.dmac_laddress);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[num_buf].pa_hi =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ADDR_HI(cookie.dmac_laddress);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[num_buf].length =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (uint32_t)cookie.dmac_size;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length +=
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload.u0.u1.sgl[num_buf].length;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.sge_count++;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (count > 1)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_nextcookie(dma_handle, &cookie);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), OCE_BMBX_RHDR_SZ +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (sizeof (struct oce_mq_sge) * count));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill rest of mbx */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.u0.s.embedded = 1;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mbx.payload_length = payload_length;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(mp->b_cont->b_rptr, &mbx.payload, payload_length);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&mbx), OCE_BMBX_RHDR_SZ);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now post the command */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_mbox_post(dev, &mbx, NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(mp->b_cont->b_rptr, &hdr, sizeof (struct mbx_hdr));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DW_SWAP(u32ptr(&hdr), sizeof (struct mbx_hdr));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to post the mailbox: %d", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *payload_len = hdr.u0.rsp.rsp_length +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_hdr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (is_embedded) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(&mbx.payload, mp->b_cont->b_rptr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MBLKL(mp->b_cont));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_sync(dma_handle, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_dma_handle(dev, dma_handle) !=
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip,
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(sg_va, mp->b_cont->b_rptr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_hdr));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto post_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (hdr.u0.req.opcode == OPCODE_WRITE_COMMON_FLASHROM) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct mbx_common_read_write_flashrom *fwcmd =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (struct mbx_common_read_write_flashrom *)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mp->b_cont->b_rptr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (LE_32(fwcmd->flash_op_code) == MGMT_FLASHROM_OPCODE_FLASH)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->cookie = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan payload_length = hdr.u0.rsp.rsp_length + sizeof (struct mbx_hdr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Copy the response back only if this is an embedded mbx cmd */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (is_embedded) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bcopy(&mbx.payload, mp->b_cont->b_rptr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan min(payload_length, MBLKL(mp->b_cont)));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore mblk_t *tmp = NULL;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore int offset = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* sync */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_sync(dma_handle, 0, 0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_dma_handle(dev, dma_handle) != DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* copy back from kernel allocated buffer to user buffer */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore for (tmp = mp->b_cont; tmp != NULL; tmp = tmp->b_cont) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore bcopy(sg_va + offset, tmp->b_rptr, MBLKL(tmp));
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore offset += MBLKL(tmp);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* unbind and free dma handles */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_unbind_handle(dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_mem_free(&acc_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_free_handle(&dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *payload_len = payload_length;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanpost_fail:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_unbind_handle(dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathandma_bind_fail:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_mem_free(&acc_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathandma_alloc_fail:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_free_handle(&dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanfail:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanalloc_err:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (hdr.u0.req.opcode == OPCODE_WRITE_COMMON_FLASHROM) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->cookie = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}