1/*- 2 * Copyright (C) 2012 Emulex 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, --- 23 unchanged lines hidden (view full) --- 32 * freebsd-drivers@emulex.com 33 * 34 * Emulex 35 * 3333 Susan Street 36 * Costa Mesa, CA 92626 37 */ 38 39 |
40/* $FreeBSD: head/sys/dev/oce/oce_mbox.c 231879 2012-02-17 13:55:17Z luigi $ */ |
41 |
42#include "oce_if.h" 43 44 45/** 46 * @brief Reset (firmware) common function 47 * @param sc software handle to the device 48 * @returns 0 on success, ETIMEDOUT on failure 49 */ --- 88 unchanged lines hidden (view full) --- 138 } 139 140 device_printf(sc->dev, "Mailbox timed out\n"); 141 142 return ETIMEDOUT; 143} 144 145 |
146/** 147 * @brief Mailbox dispatch 148 * @param sc software handle to the device 149 * @param tmo_sec timeout in seconds 150 */ 151int 152oce_mbox_dispatch(POCE_SOFTC sc, uint32_t tmo_sec) 153{ --- 127 unchanged lines hidden (view full) --- 281 282 bcopy(fwcmd->params.rsp.fw_ver_str, sc->fw_version, 32); 283 284 return 0; 285} 286 287 288/** |
289 * @brief Firmware will send gracious notifications during 290 * attach only after sending first mcc commnad. We 291 * use MCC queue only for getting async and mailbox 292 * for sending cmds. So to get gracious notifications 293 * atleast send one dummy command on mcc. 294 */ 295int 296oce_first_mcc_cmd(POCE_SOFTC sc) 297{ 298 struct oce_mbx *mbx; 299 struct oce_mq *mq = sc->mq; 300 struct mbx_get_common_fw_version *fwcmd; 301 uint32_t reg_value; 302 303 mbx = RING_GET_PRODUCER_ITEM_VA(mq->ring, struct oce_mbx); 304 bzero(mbx, sizeof(struct oce_mbx)); 305 306 fwcmd = (struct mbx_get_common_fw_version *)&mbx->payload; 307 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0, 308 MBX_SUBSYSTEM_COMMON, 309 OPCODE_COMMON_GET_FW_VERSION, 310 MBX_TIMEOUT_SEC, 311 sizeof(struct mbx_get_common_fw_version), 312 OCE_MBX_VER_V0); 313 mbx->u0.s.embedded = 1; 314 mbx->payload_length = sizeof(struct mbx_get_common_fw_version); 315 bus_dmamap_sync(mq->ring->dma.tag, mq->ring->dma.map, 316 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 317 RING_PUT(mq->ring, 1); 318 reg_value = (1 << 16) | mq->mq_id; 319 OCE_WRITE_REG32(sc, db, PD_MQ_DB, reg_value); 320 321 return 0; 322} 323 324/** |
325 * @brief Function to post a MBX to the mbox 326 * @param sc software handle to the device 327 * @param mbx pointer to the MBX to send 328 * @param mbxctx pointer to the mbx context structure 329 * @returns 0 on success, error on failure 330 */ 331int 332oce_mbox_post(POCE_SOFTC sc, struct oce_mbx *mbx, struct oce_mbx_ctx *mbxctx) --- 1023 unchanged lines hidden (view full) --- 1356 mbx.u0.s.sge_count = 1; 1357 1358 sgl = &mbx.payload.u0.u1.sgl[0]; 1359 sgl->pa_hi = upper_32_bits(pdma_mem->paddr); 1360 sgl->pa_lo = pdma_mem->paddr & 0xFFFFFFFF; 1361 sgl->length = payload_len; 1362 1363 /* post the command */ |
1364 rc = oce_mbox_post(sc, &mbx, NULL); |
1365 if (rc) { 1366 device_printf(sc->dev, "Write FlashROM mbox post failed\n"); 1367 } else { 1368 rc = fwcmd->hdr.u0.rsp.status; 1369 } 1370 1371 return rc; 1372 --- 367 unchanged lines hidden --- |