Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*


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