+/**
+ * qla2x00_update_fw_options() - Read and process firmware options.
+ * @ha: HA context
+ *
+ * Returns 0 on success.
+ */
+static void
+qla2x00_update_fw_options(scsi_qla_host_t *ha)
+{
+ /* Setup seriallink options */
+ uint16_t swing, emphasis;
+
+ memset(ha->fw_options, 0, sizeof(ha->fw_options));
+ qla2x00_get_fw_options(ha, ha->fw_options);
+
+ if (IS_QLA2100(ha) || IS_QLA2200(ha))
+ return;
+
+ /* Serial Link options. */
+ DEBUG3(printk("scsi(%ld): Serial link options:\n",
+ ha->host_no));
+ DEBUG3(qla2x00_dump_buffer((uint8_t *)&ha->fw_seriallink_options,
+ sizeof(ha->fw_seriallink_options)));
+
+ ha->fw_options[1] &= ~FO1_SET_EMPHASIS_SWING;
+ if (ha->fw_seriallink_options[1] & BIT_2)
+ ha->fw_options[1] |= FO1_SET_EMPHASIS_SWING;
+
+ /* 1G settings */
+ swing = ha->fw_seriallink_options[0] & (BIT_2 | BIT_1 | BIT_0);
+ emphasis = ha->fw_seriallink_options[0] & (BIT_4 | BIT_3);
+ emphasis >>= 3;
+ ha->fw_options[10] = (emphasis << 14) | (swing << 8) | 0x3;
+
+ /* 2G settings */
+ swing = ha->fw_seriallink_options[0] & (BIT_7 | BIT_6 | BIT_5);
+ swing >>= 5;
+ emphasis = ha->fw_seriallink_options[1] & (BIT_1 | BIT_0);
+ ha->fw_options[11] = (emphasis << 14) | (swing << 8) | 0x3;
+
+ /* FCP2 options. */
+ /* Return command IOCBs without waiting for an ABTS to complete. */
+ ha->fw_options[3] |= BIT_13;
+
+ /* Update Serial Link options. */
+ qla2x00_set_fw_options(ha, ha->fw_options);
+}
+