Commit 9cfbfa70 authored by Cathy Zhou's avatar Cathy Zhou Committed by Jeff Kirsher

ixgbe: cleanup sparse warnings

Sparse complains valid conversions between restricted types, force
attribute is used to avoid those warnings.
Signed-off-by: default avatarCathy Zhou <cathy.zhou@oracle.com>
Reviewed-by: default avatarShannon Nelson <shannon.nelson@oracle.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent b9f672af
...@@ -1436,7 +1436,8 @@ void ixgbe_atr_compute_perfect_hash_82599(union ixgbe_atr_input *input, ...@@ -1436,7 +1436,8 @@ void ixgbe_atr_compute_perfect_hash_82599(union ixgbe_atr_input *input,
{ {
u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan; u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan;
u32 bucket_hash = 0, hi_dword = 0; u32 bucket_hash = 0;
__be32 hi_dword = 0;
int i; int i;
/* Apply masks to input data */ /* Apply masks to input data */
...@@ -1475,7 +1476,7 @@ void ixgbe_atr_compute_perfect_hash_82599(union ixgbe_atr_input *input, ...@@ -1475,7 +1476,7 @@ void ixgbe_atr_compute_perfect_hash_82599(union ixgbe_atr_input *input,
* Limit hash to 13 bits since max bucket count is 8K. * Limit hash to 13 bits since max bucket count is 8K.
* Store result at the end of the input stream. * Store result at the end of the input stream.
*/ */
input->formatted.bkt_hash = bucket_hash & 0x1FFF; input->formatted.bkt_hash = (__force __be16)(bucket_hash & 0x1FFF);
} }
/** /**
...@@ -1584,7 +1585,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw, ...@@ -1584,7 +1585,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
return IXGBE_ERR_CONFIG; return IXGBE_ERR_CONFIG;
} }
switch (input_mask->formatted.flex_bytes & 0xFFFF) { switch ((__force u16)input_mask->formatted.flex_bytes & 0xFFFF) {
case 0x0000: case 0x0000:
/* Mask Flex Bytes */ /* Mask Flex Bytes */
fdirm |= IXGBE_FDIRM_FLEX; fdirm |= IXGBE_FDIRM_FLEX;
...@@ -1654,13 +1655,13 @@ s32 ixgbe_fdir_write_perfect_filter_82599(struct ixgbe_hw *hw, ...@@ -1654,13 +1655,13 @@ s32 ixgbe_fdir_write_perfect_filter_82599(struct ixgbe_hw *hw,
IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport); IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport);
/* record vlan (little-endian) and flex_bytes(big-endian) */ /* record vlan (little-endian) and flex_bytes(big-endian) */
fdirvlan = IXGBE_STORE_AS_BE16(input->formatted.flex_bytes); fdirvlan = IXGBE_STORE_AS_BE16((__force u16)input->formatted.flex_bytes);
fdirvlan <<= IXGBE_FDIRVLAN_FLEX_SHIFT; fdirvlan <<= IXGBE_FDIRVLAN_FLEX_SHIFT;
fdirvlan |= ntohs(input->formatted.vlan_id); fdirvlan |= ntohs(input->formatted.vlan_id);
IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, fdirvlan); IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, fdirvlan);
/* configure FDIRHASH register */ /* configure FDIRHASH register */
fdirhash = input->formatted.bkt_hash; fdirhash = (__force u32)input->formatted.bkt_hash;
fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT; fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT;
IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash);
...@@ -1698,7 +1699,7 @@ s32 ixgbe_fdir_erase_perfect_filter_82599(struct ixgbe_hw *hw, ...@@ -1698,7 +1699,7 @@ s32 ixgbe_fdir_erase_perfect_filter_82599(struct ixgbe_hw *hw,
s32 err; s32 err;
/* configure FDIRHASH register */ /* configure FDIRHASH register */
fdirhash = input->formatted.bkt_hash; fdirhash = (__force u32)input->formatted.bkt_hash;
fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT; fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT;
IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash);
......
...@@ -3626,7 +3626,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length, ...@@ -3626,7 +3626,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
*/ */
for (i = 0; i < dword_len; i++) for (i = 0; i < dword_len; i++)
IXGBE_WRITE_REG_ARRAY(hw, IXGBE_FLEX_MNG, IXGBE_WRITE_REG_ARRAY(hw, IXGBE_FLEX_MNG,
i, cpu_to_le32(buffer[i])); i, (__force u32)cpu_to_le32(buffer[i]));
/* Setting this bit tells the ARC that a new command is pending. */ /* Setting this bit tells the ARC that a new command is pending. */
IXGBE_WRITE_REG(hw, IXGBE_HICR, hicr | IXGBE_HICR_C); IXGBE_WRITE_REG(hw, IXGBE_HICR, hicr | IXGBE_HICR_C);
......
...@@ -440,7 +440,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter, ...@@ -440,7 +440,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
case cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_FCPRSP): case cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_FCPRSP):
dma_unmap_sg(&adapter->pdev->dev, ddp->sgl, dma_unmap_sg(&adapter->pdev->dev, ddp->sgl,
ddp->sgc, DMA_FROM_DEVICE); ddp->sgc, DMA_FROM_DEVICE);
ddp->err = ddp_err; ddp->err = (__force u32)ddp_err;
ddp->sgl = NULL; ddp->sgl = NULL;
ddp->sgc = 0; ddp->sgc = 0;
/* fall through */ /* fall through */
......
...@@ -19,8 +19,9 @@ static void ixgbe_ipsec_set_tx_sa(struct ixgbe_hw *hw, u16 idx, ...@@ -19,8 +19,9 @@ static void ixgbe_ipsec_set_tx_sa(struct ixgbe_hw *hw, u16 idx,
int i; int i;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
IXGBE_WRITE_REG(hw, IXGBE_IPSTXKEY(i), cpu_to_be32(key[3 - i])); IXGBE_WRITE_REG(hw, IXGBE_IPSTXKEY(i),
IXGBE_WRITE_REG(hw, IXGBE_IPSTXSALT, cpu_to_be32(salt)); (__force u32)cpu_to_be32(key[3 - i]));
IXGBE_WRITE_REG(hw, IXGBE_IPSTXSALT, (__force u32)cpu_to_be32(salt));
IXGBE_WRITE_FLUSH(hw); IXGBE_WRITE_FLUSH(hw);
reg = IXGBE_READ_REG(hw, IXGBE_IPSTXIDX); reg = IXGBE_READ_REG(hw, IXGBE_IPSTXIDX);
...@@ -69,7 +70,8 @@ static void ixgbe_ipsec_set_rx_sa(struct ixgbe_hw *hw, u16 idx, __be32 spi, ...@@ -69,7 +70,8 @@ static void ixgbe_ipsec_set_rx_sa(struct ixgbe_hw *hw, u16 idx, __be32 spi,
int i; int i;
/* store the SPI (in bigendian) and IPidx */ /* store the SPI (in bigendian) and IPidx */
IXGBE_WRITE_REG(hw, IXGBE_IPSRXSPI, cpu_to_le32(spi)); IXGBE_WRITE_REG(hw, IXGBE_IPSRXSPI,
(__force u32)cpu_to_le32((__force u32)spi));
IXGBE_WRITE_REG(hw, IXGBE_IPSRXIPIDX, ip_idx); IXGBE_WRITE_REG(hw, IXGBE_IPSRXIPIDX, ip_idx);
IXGBE_WRITE_FLUSH(hw); IXGBE_WRITE_FLUSH(hw);
...@@ -77,8 +79,9 @@ static void ixgbe_ipsec_set_rx_sa(struct ixgbe_hw *hw, u16 idx, __be32 spi, ...@@ -77,8 +79,9 @@ static void ixgbe_ipsec_set_rx_sa(struct ixgbe_hw *hw, u16 idx, __be32 spi,
/* store the key, salt, and mode */ /* store the key, salt, and mode */
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
IXGBE_WRITE_REG(hw, IXGBE_IPSRXKEY(i), cpu_to_be32(key[3 - i])); IXGBE_WRITE_REG(hw, IXGBE_IPSRXKEY(i),
IXGBE_WRITE_REG(hw, IXGBE_IPSRXSALT, cpu_to_be32(salt)); (__force u32)cpu_to_be32(key[3 - i]));
IXGBE_WRITE_REG(hw, IXGBE_IPSRXSALT, (__force u32)cpu_to_be32(salt));
IXGBE_WRITE_REG(hw, IXGBE_IPSRXMOD, mode); IXGBE_WRITE_REG(hw, IXGBE_IPSRXMOD, mode);
IXGBE_WRITE_FLUSH(hw); IXGBE_WRITE_FLUSH(hw);
...@@ -97,7 +100,8 @@ static void ixgbe_ipsec_set_rx_ip(struct ixgbe_hw *hw, u16 idx, __be32 addr[]) ...@@ -97,7 +100,8 @@ static void ixgbe_ipsec_set_rx_ip(struct ixgbe_hw *hw, u16 idx, __be32 addr[])
/* store the ip address */ /* store the ip address */
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
IXGBE_WRITE_REG(hw, IXGBE_IPSRXIPADDR(i), cpu_to_le32(addr[i])); IXGBE_WRITE_REG(hw, IXGBE_IPSRXIPADDR(i),
(__force u32)cpu_to_le32((__force u32)addr[i]));
IXGBE_WRITE_FLUSH(hw); IXGBE_WRITE_FLUSH(hw);
ixgbe_ipsec_set_rx_item(hw, idx, ips_rx_ip_tbl); ixgbe_ipsec_set_rx_item(hw, idx, ips_rx_ip_tbl);
...@@ -367,7 +371,8 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec, ...@@ -367,7 +371,8 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec,
struct xfrm_state *ret = NULL; struct xfrm_state *ret = NULL;
rcu_read_lock(); rcu_read_lock();
hash_for_each_possible_rcu(ipsec->rx_sa_list, rsa, hlist, spi) hash_for_each_possible_rcu(ipsec->rx_sa_list, rsa, hlist,
(__force u32)spi) {
if (spi == rsa->xs->id.spi && if (spi == rsa->xs->id.spi &&
((ip4 && *daddr == rsa->xs->id.daddr.a4) || ((ip4 && *daddr == rsa->xs->id.daddr.a4) ||
(!ip4 && !memcmp(daddr, &rsa->xs->id.daddr.a6, (!ip4 && !memcmp(daddr, &rsa->xs->id.daddr.a6,
...@@ -377,6 +382,7 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec, ...@@ -377,6 +382,7 @@ static struct xfrm_state *ixgbe_ipsec_find_rx_state(struct ixgbe_ipsec *ipsec,
xfrm_state_hold(ret); xfrm_state_hold(ret);
break; break;
} }
}
rcu_read_unlock(); rcu_read_unlock();
return ret; return ret;
} }
...@@ -569,7 +575,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs) ...@@ -569,7 +575,7 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs)
/* hash the new entry for faster search in Rx path */ /* hash the new entry for faster search in Rx path */
hash_add_rcu(ipsec->rx_sa_list, &ipsec->rx_tbl[sa_idx].hlist, hash_add_rcu(ipsec->rx_sa_list, &ipsec->rx_tbl[sa_idx].hlist,
rsa.xs->id.spi); (__force u64)rsa.xs->id.spi);
} else { } else {
struct tx_sa tsa; struct tx_sa tsa;
...@@ -653,7 +659,8 @@ static void ixgbe_ipsec_del_sa(struct xfrm_state *xs) ...@@ -653,7 +659,8 @@ static void ixgbe_ipsec_del_sa(struct xfrm_state *xs)
if (!ipsec->ip_tbl[ipi].ref_cnt) { if (!ipsec->ip_tbl[ipi].ref_cnt) {
memset(&ipsec->ip_tbl[ipi], 0, memset(&ipsec->ip_tbl[ipi], 0,
sizeof(struct rx_ip_sa)); sizeof(struct rx_ip_sa));
ixgbe_ipsec_set_rx_ip(hw, ipi, zerobuf); ixgbe_ipsec_set_rx_ip(hw, ipi,
(__force __be32 *)zerobuf);
} }
} }
......
...@@ -727,8 +727,8 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter) ...@@ -727,8 +727,8 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)
ring_desc = ""; ring_desc = "";
pr_info("T [0x%03X] %016llX %016llX %016llX %08X %p %016llX %p%s", pr_info("T [0x%03X] %016llX %016llX %016llX %08X %p %016llX %p%s",
i, i,
le64_to_cpu(u0->a), le64_to_cpu((__force __le64)u0->a),
le64_to_cpu(u0->b), le64_to_cpu((__force __le64)u0->b),
(u64)dma_unmap_addr(tx_buffer, dma), (u64)dma_unmap_addr(tx_buffer, dma),
dma_unmap_len(tx_buffer, len), dma_unmap_len(tx_buffer, len),
tx_buffer->next_to_watch, tx_buffer->next_to_watch,
...@@ -839,15 +839,15 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter) ...@@ -839,15 +839,15 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)
/* Descriptor Done */ /* Descriptor Done */
pr_info("RWB[0x%03X] %016llX %016llX ---------------- %p%s\n", pr_info("RWB[0x%03X] %016llX %016llX ---------------- %p%s\n",
i, i,
le64_to_cpu(u0->a), le64_to_cpu((__force __le64)u0->a),
le64_to_cpu(u0->b), le64_to_cpu((__force __le64)u0->b),
rx_buffer_info->skb, rx_buffer_info->skb,
ring_desc); ring_desc);
} else { } else {
pr_info("R [0x%03X] %016llX %016llX %016llX %p%s\n", pr_info("R [0x%03X] %016llX %016llX %016llX %p%s\n",
i, i,
le64_to_cpu(u0->a), le64_to_cpu((__force __le64)u0->a),
le64_to_cpu(u0->b), le64_to_cpu((__force __le64)u0->b),
(u64)rx_buffer_info->dma, (u64)rx_buffer_info->dma,
rx_buffer_info->skb, rx_buffer_info->skb,
ring_desc); ring_desc);
...@@ -7751,7 +7751,7 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring, ...@@ -7751,7 +7751,7 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
/* remove payload length from inner checksum */ /* remove payload length from inner checksum */
paylen = skb->len - l4_offset; paylen = skb->len - l4_offset;
csum_replace_by_diff(&l4.tcp->check, htonl(paylen)); csum_replace_by_diff(&l4.tcp->check, (__force __wsum)htonl(paylen));
/* update gso size and bytecount with header size */ /* update gso size and bytecount with header size */
first->gso_segs = skb_shinfo(skb)->gso_segs; first->gso_segs = skb_shinfo(skb)->gso_segs;
...@@ -9104,7 +9104,8 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input, ...@@ -9104,7 +9104,8 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input,
for (j = 0; field_ptr[j].val; j++) { for (j = 0; field_ptr[j].val; j++) {
if (field_ptr[j].off == off) { if (field_ptr[j].off == off) {
field_ptr[j].val(input, mask, val, m); field_ptr[j].val(input, mask, (__force u32)val,
(__force u32)m);
input->filter.formatted.flow_type |= input->filter.formatted.flow_type |=
field_ptr[j].type; field_ptr[j].type;
found_entry = true; found_entry = true;
...@@ -9113,8 +9114,10 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input, ...@@ -9113,8 +9114,10 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input,
} }
if (nexthdr) { if (nexthdr) {
if (nexthdr->off == cls->knode.sel->keys[i].off && if (nexthdr->off == cls->knode.sel->keys[i].off &&
nexthdr->val == cls->knode.sel->keys[i].val && nexthdr->val ==
nexthdr->mask == cls->knode.sel->keys[i].mask) (__force u32)cls->knode.sel->keys[i].val &&
nexthdr->mask ==
(__force u32)cls->knode.sel->keys[i].mask)
found_jump_field = true; found_jump_field = true;
else else
continue; continue;
...@@ -9218,7 +9221,8 @@ static int ixgbe_configure_clsu32(struct ixgbe_adapter *adapter, ...@@ -9218,7 +9221,8 @@ static int ixgbe_configure_clsu32(struct ixgbe_adapter *adapter,
for (i = 0; nexthdr[i].jump; i++) { for (i = 0; nexthdr[i].jump; i++) {
if (nexthdr[i].o != cls->knode.sel->offoff || if (nexthdr[i].o != cls->knode.sel->offoff ||
nexthdr[i].s != cls->knode.sel->offshift || nexthdr[i].s != cls->knode.sel->offshift ||
nexthdr[i].m != cls->knode.sel->offmask) nexthdr[i].m !=
(__force u32)cls->knode.sel->offmask)
return err; return err;
jump = kzalloc(sizeof(*jump), GFP_KERNEL); jump = kzalloc(sizeof(*jump), GFP_KERNEL);
...@@ -9991,7 +9995,8 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) ...@@ -9991,7 +9995,8 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
} }
} else { } else {
for (i = 0; i < adapter->num_rx_queues; i++) for (i = 0; i < adapter->num_rx_queues; i++)
xchg(&adapter->rx_ring[i]->xdp_prog, adapter->xdp_prog); (void)xchg(&adapter->rx_ring[i]->xdp_prog,
adapter->xdp_prog);
} }
if (old_prog) if (old_prog)
......
...@@ -29,8 +29,8 @@ static inline int ixgbe_mat_prgm_sip(struct ixgbe_fdir_filter *input, ...@@ -29,8 +29,8 @@ static inline int ixgbe_mat_prgm_sip(struct ixgbe_fdir_filter *input,
union ixgbe_atr_input *mask, union ixgbe_atr_input *mask,
u32 val, u32 m) u32 val, u32 m)
{ {
input->filter.formatted.src_ip[0] = val; input->filter.formatted.src_ip[0] = (__force __be32)val;
mask->formatted.src_ip[0] = m; mask->formatted.src_ip[0] = (__force __be32)m;
return 0; return 0;
} }
...@@ -38,8 +38,8 @@ static inline int ixgbe_mat_prgm_dip(struct ixgbe_fdir_filter *input, ...@@ -38,8 +38,8 @@ static inline int ixgbe_mat_prgm_dip(struct ixgbe_fdir_filter *input,
union ixgbe_atr_input *mask, union ixgbe_atr_input *mask,
u32 val, u32 m) u32 val, u32 m)
{ {
input->filter.formatted.dst_ip[0] = val; input->filter.formatted.dst_ip[0] = (__force __be32)val;
mask->formatted.dst_ip[0] = m; mask->formatted.dst_ip[0] = (__force __be32)m;
return 0; return 0;
} }
...@@ -55,10 +55,10 @@ static inline int ixgbe_mat_prgm_ports(struct ixgbe_fdir_filter *input, ...@@ -55,10 +55,10 @@ static inline int ixgbe_mat_prgm_ports(struct ixgbe_fdir_filter *input,
union ixgbe_atr_input *mask, union ixgbe_atr_input *mask,
u32 val, u32 m) u32 val, u32 m)
{ {
input->filter.formatted.src_port = val & 0xffff; input->filter.formatted.src_port = (__force __be16)(val & 0xffff);
mask->formatted.src_port = m & 0xffff; mask->formatted.src_port = (__force __be16)(m & 0xffff);
input->filter.formatted.dst_port = val >> 16; input->filter.formatted.dst_port = (__force __be16)(val >> 16);
mask->formatted.dst_port = m >> 16; mask->formatted.dst_port = (__force __be16)(m >> 16);
return 0; return 0;
}; };
......
...@@ -878,8 +878,9 @@ static s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw, ...@@ -878,8 +878,9 @@ static s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM; buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
/* convert offset from words to bytes */ /* convert offset from words to bytes */
buffer.address = cpu_to_be32((offset + current_word) * 2); buffer.address = (__force u32)cpu_to_be32((offset +
buffer.length = cpu_to_be16(words_to_read * 2); current_word) * 2);
buffer.length = (__force u16)cpu_to_be16(words_to_read * 2);
buffer.pad2 = 0; buffer.pad2 = 0;
buffer.pad3 = 0; buffer.pad3 = 0;
...@@ -1089,9 +1090,9 @@ static s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 *data) ...@@ -1089,9 +1090,9 @@ static s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 *data)
buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM; buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
/* convert offset from words to bytes */ /* convert offset from words to bytes */
buffer.address = cpu_to_be32(offset * 2); buffer.address = (__force u32)cpu_to_be32(offset * 2);
/* one word */ /* one word */
buffer.length = cpu_to_be16(sizeof(u16)); buffer.length = (__force u16)cpu_to_be16(sizeof(u16));
status = hw->mac.ops.acquire_swfw_sync(hw, mask); status = hw->mac.ops.acquire_swfw_sync(hw, mask);
if (status) if (status)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment