]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * QLogic Fibre Channel HBA Driver | |
3 | * Copyright (c) 2003-2008 QLogic Corporation | |
4 | * | |
5 | * See LICENSE.qla2xxx for copyright and licensing details. | |
6 | */ | |
7 | ||
8 | /* | |
9 | * qla2x00_debounce_register | |
10 | * Debounce register. | |
11 | * | |
12 | * Input: | |
13 | * port = register address. | |
14 | * | |
15 | * Returns: | |
16 | * register value. | |
17 | */ | |
18 | static __inline__ uint16_t | |
19 | qla2x00_debounce_register(volatile uint16_t __iomem *addr) | |
20 | { | |
21 | volatile uint16_t first; | |
22 | volatile uint16_t second; | |
23 | ||
24 | do { | |
25 | first = RD_REG_WORD(addr); | |
26 | barrier(); | |
27 | cpu_relax(); | |
28 | second = RD_REG_WORD(addr); | |
29 | } while (first != second); | |
30 | ||
31 | return (first); | |
32 | } | |
33 | ||
34 | static inline void | |
35 | qla2x00_poll(struct rsp_que *rsp) | |
36 | { | |
37 | unsigned long flags; | |
38 | struct qla_hw_data *ha = rsp->hw; | |
39 | local_irq_save(flags); | |
40 | ha->isp_ops->intr_handler(0, rsp); | |
41 | local_irq_restore(flags); | |
42 | } | |
43 | ||
44 | /** | |
45 | * qla2x00_issue_marker() - Issue a Marker IOCB if necessary. | |
46 | * @ha: HA context | |
47 | * @ha_locked: is function called with the hardware lock | |
48 | * | |
49 | * Returns non-zero if a failure occurred, else zero. | |
50 | */ | |
51 | static inline int | |
52 | qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked) | |
53 | { | |
54 | /* Send marker if required */ | |
55 | if (vha->marker_needed != 0) { | |
56 | if (ha_locked) { | |
57 | if (__qla2x00_marker(vha, 0, 0, MK_SYNC_ALL) != | |
58 | QLA_SUCCESS) | |
59 | return (QLA_FUNCTION_FAILED); | |
60 | } else { | |
61 | if (qla2x00_marker(vha, 0, 0, MK_SYNC_ALL) != | |
62 | QLA_SUCCESS) | |
63 | return (QLA_FUNCTION_FAILED); | |
64 | } | |
65 | vha->marker_needed = 0; | |
66 | } | |
67 | return (QLA_SUCCESS); | |
68 | } | |
69 | ||
70 | static inline uint8_t * | |
71 | host_to_fcp_swap(uint8_t *fcp, uint32_t bsize) | |
72 | { | |
73 | uint32_t *ifcp = (uint32_t *) fcp; | |
74 | uint32_t *ofcp = (uint32_t *) fcp; | |
75 | uint32_t iter = bsize >> 2; | |
76 | ||
77 | for (; iter ; iter--) | |
78 | *ofcp++ = swab32(*ifcp++); | |
79 | ||
80 | return fcp; | |
81 | } | |
82 | ||
83 | static inline int | |
84 | qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) | |
85 | { | |
86 | struct qla_hw_data *ha = vha->hw; | |
87 | if (IS_FWI2_CAPABLE(ha)) | |
88 | return (loop_id > NPH_LAST_HANDLE); | |
89 | ||
90 | return ((loop_id > ha->max_loop_id && loop_id < SNS_FIRST_LOOP_ID) || | |
91 | loop_id == MANAGEMENT_SERVER || loop_id == BROADCAST); | |
92 | }; |