1782 ret = EINVAL;
1783 iocd->stmf_error = QLTIO_INVALID_FW_SIZE;
1784 break;
1785 }
1786 if ((qlt->qlt_81xx_chip && ((intp[8] & 8) == 0)) ||
1787 (qlt->qlt_25xx_chip && ((intp[8] & 4) == 0)) ||
1788 (!qlt->qlt_25xx_chip && !qlt->qlt_81xx_chip &&
1789 ((intp[8] & 3) == 0))) {
1790 EL(qlt, "UPLOAD_FW fw_type=%d\n", intp[8]);
1791 ret = EACCES;
1792 iocd->stmf_error = QLTIO_INVALID_FW_TYPE;
1793 break;
1794 }
1795
1796 /* Everything looks ok, lets copy this firmware */
1797 if (qlt->fw_code01) {
1798 kmem_free(qlt->fw_code01, (qlt->fw_length01 +
1799 qlt->fw_length02) << 2);
1800 qlt->fw_code01 = NULL;
1801 } else {
1802 atomic_add_32(&qlt_loaded_counter, 1);
1803 }
1804 qlt->fw_length01 = intp[3];
1805 qlt->fw_code01 = (uint32_t *)kmem_alloc(iocd->stmf_ibuf_size,
1806 KM_SLEEP);
1807 bcopy(intp, qlt->fw_code01, iocd->stmf_ibuf_size);
1808 qlt->fw_addr01 = intp[2];
1809 qlt->fw_code02 = &qlt->fw_code01[intp[3]];
1810 qlt->fw_addr02 = qlt->fw_code02[2];
1811 qlt->fw_length02 = qlt->fw_code02[3];
1812 break;
1813
1814 case QLT_IOCTL_CLEAR_FW:
1815 if (qlt->fw_code01) {
1816 kmem_free(qlt->fw_code01, (qlt->fw_length01 +
1817 qlt->fw_length02) << 2);
1818 qlt->fw_code01 = NULL;
1819 atomic_add_32(&qlt_loaded_counter, -1);
1820 }
1821 break;
1822
1823 case QLT_IOCTL_GET_FW_INFO:
1824 if (iocd->stmf_obuf_size != sizeof (qlt_fw_info_t)) {
1825 EL(qlt, "GET_FW_INFO obuf_size=%d != %d\n",
1826 iocd->stmf_obuf_size, sizeof (qlt_fw_info_t));
1827 ret = EINVAL;
1828 break;
1829 }
1830 fwi = (qlt_fw_info_t *)obuf;
1831 if (qlt->qlt_stay_offline) {
1832 fwi->fwi_stay_offline = 1;
1833 }
1834 if (qlt->qlt_state == FCT_STATE_ONLINE) {
1835 fwi->fwi_port_active = 1;
1836 }
1837 fwi->fwi_active_major = qlt->fw_major;
1838 fwi->fwi_active_minor = qlt->fw_minor;
1839 fwi->fwi_active_subminor = qlt->fw_subminor;
4654 (void) fct_port_shutdown(qlt->qlt_port, STMF_RFLAG_FATAL_ERROR |
4655 STMF_RFLAG_RESET | STMF_RFLAG_COLLECT_DEBUG_DUMP, info);
4656 }
4657
4658 #ifdef DEBUG
4659 uint32_t qlt_drop_abort_counter = 0;
4660 #endif
4661
4662 fct_status_t
4663 qlt_abort_cmd(struct fct_local_port *port, fct_cmd_t *cmd, uint32_t flags)
4664 {
4665 qlt_state_t *qlt = (qlt_state_t *)port->port_fca_private;
4666
4667 if ((qlt->qlt_state == FCT_STATE_OFFLINE) ||
4668 (qlt->qlt_state == FCT_STATE_OFFLINING)) {
4669 return (FCT_NOT_FOUND);
4670 }
4671
4672 #ifdef DEBUG
4673 if (qlt_drop_abort_counter > 0) {
4674 if (atomic_add_32_nv(&qlt_drop_abort_counter, -1) == 1)
4675 return (FCT_SUCCESS);
4676 }
4677 #endif
4678
4679 if (cmd->cmd_type == FCT_CMD_FCP_XCHG) {
4680 return (qlt_abort_unsol_scsi_cmd(qlt, cmd));
4681 }
4682
4683 if (flags & FCT_IOF_FORCE_FCA_DONE) {
4684 cmd->cmd_handle = 0;
4685 }
4686
4687 if (cmd->cmd_type == FCT_CMD_RCVD_ABTS) {
4688 return (qlt_send_abts_response(qlt, cmd, 1));
4689 }
4690
4691 if (cmd->cmd_type == FCT_CMD_RCVD_ELS) {
4692 return (qlt_abort_purex(qlt, cmd));
4693 }
4694
|
1782 ret = EINVAL;
1783 iocd->stmf_error = QLTIO_INVALID_FW_SIZE;
1784 break;
1785 }
1786 if ((qlt->qlt_81xx_chip && ((intp[8] & 8) == 0)) ||
1787 (qlt->qlt_25xx_chip && ((intp[8] & 4) == 0)) ||
1788 (!qlt->qlt_25xx_chip && !qlt->qlt_81xx_chip &&
1789 ((intp[8] & 3) == 0))) {
1790 EL(qlt, "UPLOAD_FW fw_type=%d\n", intp[8]);
1791 ret = EACCES;
1792 iocd->stmf_error = QLTIO_INVALID_FW_TYPE;
1793 break;
1794 }
1795
1796 /* Everything looks ok, lets copy this firmware */
1797 if (qlt->fw_code01) {
1798 kmem_free(qlt->fw_code01, (qlt->fw_length01 +
1799 qlt->fw_length02) << 2);
1800 qlt->fw_code01 = NULL;
1801 } else {
1802 atomic_inc_32(&qlt_loaded_counter);
1803 }
1804 qlt->fw_length01 = intp[3];
1805 qlt->fw_code01 = (uint32_t *)kmem_alloc(iocd->stmf_ibuf_size,
1806 KM_SLEEP);
1807 bcopy(intp, qlt->fw_code01, iocd->stmf_ibuf_size);
1808 qlt->fw_addr01 = intp[2];
1809 qlt->fw_code02 = &qlt->fw_code01[intp[3]];
1810 qlt->fw_addr02 = qlt->fw_code02[2];
1811 qlt->fw_length02 = qlt->fw_code02[3];
1812 break;
1813
1814 case QLT_IOCTL_CLEAR_FW:
1815 if (qlt->fw_code01) {
1816 kmem_free(qlt->fw_code01, (qlt->fw_length01 +
1817 qlt->fw_length02) << 2);
1818 qlt->fw_code01 = NULL;
1819 atomic_dec_32(&qlt_loaded_counter);
1820 }
1821 break;
1822
1823 case QLT_IOCTL_GET_FW_INFO:
1824 if (iocd->stmf_obuf_size != sizeof (qlt_fw_info_t)) {
1825 EL(qlt, "GET_FW_INFO obuf_size=%d != %d\n",
1826 iocd->stmf_obuf_size, sizeof (qlt_fw_info_t));
1827 ret = EINVAL;
1828 break;
1829 }
1830 fwi = (qlt_fw_info_t *)obuf;
1831 if (qlt->qlt_stay_offline) {
1832 fwi->fwi_stay_offline = 1;
1833 }
1834 if (qlt->qlt_state == FCT_STATE_ONLINE) {
1835 fwi->fwi_port_active = 1;
1836 }
1837 fwi->fwi_active_major = qlt->fw_major;
1838 fwi->fwi_active_minor = qlt->fw_minor;
1839 fwi->fwi_active_subminor = qlt->fw_subminor;
4654 (void) fct_port_shutdown(qlt->qlt_port, STMF_RFLAG_FATAL_ERROR |
4655 STMF_RFLAG_RESET | STMF_RFLAG_COLLECT_DEBUG_DUMP, info);
4656 }
4657
4658 #ifdef DEBUG
4659 uint32_t qlt_drop_abort_counter = 0;
4660 #endif
4661
4662 fct_status_t
4663 qlt_abort_cmd(struct fct_local_port *port, fct_cmd_t *cmd, uint32_t flags)
4664 {
4665 qlt_state_t *qlt = (qlt_state_t *)port->port_fca_private;
4666
4667 if ((qlt->qlt_state == FCT_STATE_OFFLINE) ||
4668 (qlt->qlt_state == FCT_STATE_OFFLINING)) {
4669 return (FCT_NOT_FOUND);
4670 }
4671
4672 #ifdef DEBUG
4673 if (qlt_drop_abort_counter > 0) {
4674 if (atomic_dec_32_nv(&qlt_drop_abort_counter) == 1)
4675 return (FCT_SUCCESS);
4676 }
4677 #endif
4678
4679 if (cmd->cmd_type == FCT_CMD_FCP_XCHG) {
4680 return (qlt_abort_unsol_scsi_cmd(qlt, cmd));
4681 }
4682
4683 if (flags & FCT_IOF_FORCE_FCA_DONE) {
4684 cmd->cmd_handle = 0;
4685 }
4686
4687 if (cmd->cmd_type == FCT_CMD_RCVD_ABTS) {
4688 return (qlt_send_abts_response(qlt, cmd, 1));
4689 }
4690
4691 if (cmd->cmd_type == FCT_CMD_RCVD_ELS) {
4692 return (qlt_abort_purex(qlt, cmd));
4693 }
4694
|