aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/p54
diff options
context:
space:
mode:
authorJoe Perches <joe@perches.com>2010-07-26 17:39:58 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-07-27 15:14:13 -0400
commitc96c31e499b70964cfc88744046c998bb710e4b8 (patch)
tree0157102fbc952e3646690f3491199607669eed69 /drivers/net/wireless/p54
parente1db74fcc3d95c8a051ec457241b5aa65a01a603 (diff)
drivers/net/wireless: Use wiphy_<level>
Standardize the logging macros used. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/p54')
-rw-r--r--drivers/net/wireless/p54/eeprom.c76
-rw-r--r--drivers/net/wireless/p54/fwio.c53
-rw-r--r--drivers/net/wireless/p54/led.c8
-rw-r--r--drivers/net/wireless/p54/p54pci.c3
-rw-r--r--drivers/net/wireless/p54/txrx.c36
5 files changed, 85 insertions, 91 deletions
diff --git a/drivers/net/wireless/p54/eeprom.c b/drivers/net/wireless/p54/eeprom.c
index e51650ed49f2..d687cb7f2a59 100644
--- a/drivers/net/wireless/p54/eeprom.c
+++ b/drivers/net/wireless/p54/eeprom.c
@@ -149,16 +149,15 @@ static int p54_generate_band(struct ieee80211_hw *dev,
149 continue; 149 continue;
150 150
151 if (list->channels[i].data != CHAN_HAS_ALL) { 151 if (list->channels[i].data != CHAN_HAS_ALL) {
152 printk(KERN_ERR "%s:%s%s%s is/are missing for " 152 wiphy_err(dev->wiphy,
153 "channel:%d [%d MHz].\n", 153 "%s%s%s is/are missing for channel:%d [%d MHz].\n",
154 wiphy_name(dev->wiphy), 154 (list->channels[i].data & CHAN_HAS_CAL ? "" :
155 (list->channels[i].data & CHAN_HAS_CAL ? "" : 155 " [iqauto calibration data]"),
156 " [iqauto calibration data]"), 156 (list->channels[i].data & CHAN_HAS_LIMIT ? "" :
157 (list->channels[i].data & CHAN_HAS_LIMIT ? "" : 157 " [output power limits]"),
158 " [output power limits]"), 158 (list->channels[i].data & CHAN_HAS_CURVE ? "" :
159 (list->channels[i].data & CHAN_HAS_CURVE ? "" : 159 " [curve data]"),
160 " [curve data]"), 160 list->channels[i].index, list->channels[i].freq);
161 list->channels[i].index, list->channels[i].freq);
162 continue; 161 continue;
163 } 162 }
164 163
@@ -168,9 +167,8 @@ static int p54_generate_band(struct ieee80211_hw *dev,
168 } 167 }
169 168
170 if (j == 0) { 169 if (j == 0) {
171 printk(KERN_ERR "%s: Disabling totally damaged %s band.\n", 170 wiphy_err(dev->wiphy, "disabling totally damaged %d GHz band\n",
172 wiphy_name(dev->wiphy), (band == IEEE80211_BAND_2GHZ) ? 171 (band == IEEE80211_BAND_2GHZ) ? 2 : 5);
173 "2 GHz" : "5 GHz");
174 172
175 ret = -ENODATA; 173 ret = -ENODATA;
176 goto err_out; 174 goto err_out;
@@ -244,9 +242,9 @@ static int p54_generate_channel_lists(struct ieee80211_hw *dev)
244 242
245 if ((priv->iq_autocal_len != priv->curve_data->entries) || 243 if ((priv->iq_autocal_len != priv->curve_data->entries) ||
246 (priv->iq_autocal_len != priv->output_limit->entries)) 244 (priv->iq_autocal_len != priv->output_limit->entries))
247 printk(KERN_ERR "%s: Unsupported or damaged EEPROM detected. " 245 wiphy_err(dev->wiphy,
248 "You may not be able to use all channels.\n", 246 "Unsupported or damaged EEPROM detected. "
249 wiphy_name(dev->wiphy)); 247 "You may not be able to use all channels.\n");
250 248
251 max_channel_num = max_t(unsigned int, priv->output_limit->entries, 249 max_channel_num = max_t(unsigned int, priv->output_limit->entries,
252 priv->iq_autocal_len); 250 priv->iq_autocal_len);
@@ -419,15 +417,14 @@ static void p54_parse_rssical(struct ieee80211_hw *dev, void *data, int len,
419 int i; 417 int i;
420 418
421 if (len != (entry_size * num_entries)) { 419 if (len != (entry_size * num_entries)) {
422 printk(KERN_ERR "%s: unknown rssi calibration data packing " 420 wiphy_err(dev->wiphy,
423 " type:(%x) len:%d.\n", 421 "unknown rssi calibration data packing type:(%x) len:%d.\n",
424 wiphy_name(dev->wiphy), type, len); 422 type, len);
425 423
426 print_hex_dump_bytes("rssical:", DUMP_PREFIX_NONE, 424 print_hex_dump_bytes("rssical:", DUMP_PREFIX_NONE,
427 data, len); 425 data, len);
428 426
429 printk(KERN_ERR "%s: please report this issue.\n", 427 wiphy_err(dev->wiphy, "please report this issue.\n");
430 wiphy_name(dev->wiphy));
431 return; 428 return;
432 } 429 }
433 430
@@ -445,15 +442,14 @@ static void p54_parse_default_country(struct ieee80211_hw *dev,
445 struct pda_country *country; 442 struct pda_country *country;
446 443
447 if (len != sizeof(*country)) { 444 if (len != sizeof(*country)) {
448 printk(KERN_ERR "%s: found possible invalid default country " 445 wiphy_err(dev->wiphy,
449 "eeprom entry. (entry size: %d)\n", 446 "found possible invalid default country eeprom entry. (entry size: %d)\n",
450 wiphy_name(dev->wiphy), len); 447 len);
451 448
452 print_hex_dump_bytes("country:", DUMP_PREFIX_NONE, 449 print_hex_dump_bytes("country:", DUMP_PREFIX_NONE,
453 data, len); 450 data, len);
454 451
455 printk(KERN_ERR "%s: please report this issue.\n", 452 wiphy_err(dev->wiphy, "please report this issue.\n");
456 wiphy_name(dev->wiphy));
457 return; 453 return;
458 } 454 }
459 455
@@ -478,8 +474,8 @@ static int p54_convert_output_limits(struct ieee80211_hw *dev,
478 return -EINVAL; 474 return -EINVAL;
479 475
480 if (data[0] != 0) { 476 if (data[0] != 0) {
481 printk(KERN_ERR "%s: unknown output power db revision:%x\n", 477 wiphy_err(dev->wiphy, "unknown output power db revision:%x\n",
482 wiphy_name(dev->wiphy), data[0]); 478 data[0]);
483 return -EINVAL; 479 return -EINVAL;
484 } 480 }
485 481
@@ -587,10 +583,9 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
587 err = p54_convert_rev1(dev, curve_data); 583 err = p54_convert_rev1(dev, curve_data);
588 break; 584 break;
589 default: 585 default:
590 printk(KERN_ERR "%s: unknown curve data " 586 wiphy_err(dev->wiphy,
591 "revision %d\n", 587 "unknown curve data revision %d\n",
592 wiphy_name(dev->wiphy), 588 curve_data->cal_method_rev);
593 curve_data->cal_method_rev);
594 err = -ENODEV; 589 err = -ENODEV;
595 break; 590 break;
596 } 591 }
@@ -672,8 +667,8 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
672 667
673 if (!synth || !priv->iq_autocal || !priv->output_limit || 668 if (!synth || !priv->iq_autocal || !priv->output_limit ||
674 !priv->curve_data) { 669 !priv->curve_data) {
675 printk(KERN_ERR "%s: not all required entries found in eeprom!\n", 670 wiphy_err(dev->wiphy,
676 wiphy_name(dev->wiphy)); 671 "not all required entries found in eeprom!\n");
677 err = -EINVAL; 672 err = -EINVAL;
678 goto err; 673 goto err;
679 } 674 }
@@ -699,15 +694,15 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
699 if (!is_valid_ether_addr(dev->wiphy->perm_addr)) { 694 if (!is_valid_ether_addr(dev->wiphy->perm_addr)) {
700 u8 perm_addr[ETH_ALEN]; 695 u8 perm_addr[ETH_ALEN];
701 696
702 printk(KERN_WARNING "%s: Invalid hwaddr! Using randomly generated MAC addr\n", 697 wiphy_warn(dev->wiphy,
703 wiphy_name(dev->wiphy)); 698 "invalid hwaddr! using randomly generated mac addr\n");
704 random_ether_addr(perm_addr); 699 random_ether_addr(perm_addr);
705 SET_IEEE80211_PERM_ADDR(dev, perm_addr); 700 SET_IEEE80211_PERM_ADDR(dev, perm_addr);
706 } 701 }
707 702
708 printk(KERN_INFO "%s: hwaddr %pM, MAC:isl38%02x RF:%s\n", 703 wiphy_info(dev->wiphy, "hwaddr %pm, mac:isl38%02x rf:%s\n",
709 wiphy_name(dev->wiphy), dev->wiphy->perm_addr, priv->version, 704 dev->wiphy->perm_addr, priv->version,
710 p54_rf_chips[priv->rxhw]); 705 p54_rf_chips[priv->rxhw]);
711 706
712 return 0; 707 return 0;
713 708
@@ -719,8 +714,7 @@ err:
719 priv->output_limit = NULL; 714 priv->output_limit = NULL;
720 priv->curve_data = NULL; 715 priv->curve_data = NULL;
721 716
722 printk(KERN_ERR "%s: eeprom parse failed!\n", 717 wiphy_err(dev->wiphy, "eeprom parse failed!\n");
723 wiphy_name(dev->wiphy));
724 return err; 718 return err;
725} 719}
726EXPORT_SYMBOL_GPL(p54_parse_eeprom); 720EXPORT_SYMBOL_GPL(p54_parse_eeprom);
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c
index c43a5d461ab2..47006bca4852 100644
--- a/drivers/net/wireless/p54/fwio.c
+++ b/drivers/net/wireless/p54/fwio.c
@@ -62,16 +62,15 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
62 case FW_LM20: 62 case FW_LM20:
63 case FW_LM87: { 63 case FW_LM87: {
64 char *iftype = (char *)bootrec->data; 64 char *iftype = (char *)bootrec->data;
65 printk(KERN_INFO "%s: p54 detected a LM%c%c " 65 wiphy_info(priv->hw->wiphy,
66 "firmware\n", 66 "p54 detected a LM%c%c firmware\n",
67 wiphy_name(priv->hw->wiphy), 67 iftype[2], iftype[3]);
68 iftype[2], iftype[3]);
69 break; 68 break;
70 } 69 }
71 case FW_FMAC: 70 case FW_FMAC:
72 default: 71 default:
73 printk(KERN_ERR "%s: unsupported firmware\n", 72 wiphy_err(priv->hw->wiphy,
74 wiphy_name(priv->hw->wiphy)); 73 "unsupported firmware\n");
75 return -ENODEV; 74 return -ENODEV;
76 } 75 }
77 break; 76 break;
@@ -125,15 +124,15 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
125 } 124 }
126 125
127 if (fw_version) 126 if (fw_version)
128 printk(KERN_INFO "%s: FW rev %s - Softmac protocol %x.%x\n", 127 wiphy_info(priv->hw->wiphy,
129 wiphy_name(priv->hw->wiphy), fw_version, 128 "fw rev %s - softmac protocol %x.%x\n",
130 priv->fw_var >> 8, priv->fw_var & 0xff); 129 fw_version, priv->fw_var >> 8, priv->fw_var & 0xff);
131 130
132 if (priv->fw_var < 0x500) 131 if (priv->fw_var < 0x500)
133 printk(KERN_INFO "%s: you are using an obsolete firmware. " 132 wiphy_info(priv->hw->wiphy,
134 "visit http://wireless.kernel.org/en/users/Drivers/p54 " 133 "you are using an obsolete firmware. "
135 "and grab one for \"kernel >= 2.6.28\"!\n", 134 "visit http://wireless.kernel.org/en/users/Drivers/p54 "
136 wiphy_name(priv->hw->wiphy)); 135 "and grab one for \"kernel >= 2.6.28\"!\n");
137 136
138 if (priv->fw_var >= 0x300) { 137 if (priv->fw_var >= 0x300) {
139 /* Firmware supports QoS, use it! */ 138 /* Firmware supports QoS, use it! */
@@ -152,13 +151,14 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
152 priv->hw->queues = P54_QUEUE_AC_NUM; 151 priv->hw->queues = P54_QUEUE_AC_NUM;
153 } 152 }
154 153
155 printk(KERN_INFO "%s: cryptographic accelerator " 154 wiphy_info(priv->hw->wiphy,
156 "WEP:%s, TKIP:%s, CCMP:%s\n", wiphy_name(priv->hw->wiphy), 155 "cryptographic accelerator WEP:%s, TKIP:%s, CCMP:%s\n",
157 (priv->privacy_caps & BR_DESC_PRIV_CAP_WEP) ? "YES" : 156 (priv->privacy_caps & BR_DESC_PRIV_CAP_WEP) ? "YES" : "no",
158 "no", (priv->privacy_caps & (BR_DESC_PRIV_CAP_TKIP | 157 (priv->privacy_caps &
159 BR_DESC_PRIV_CAP_MICHAEL)) ? "YES" : "no", 158 (BR_DESC_PRIV_CAP_TKIP | BR_DESC_PRIV_CAP_MICHAEL))
160 (priv->privacy_caps & BR_DESC_PRIV_CAP_AESCCMP) ? 159 ? "YES" : "no",
161 "YES" : "no"); 160 (priv->privacy_caps & BR_DESC_PRIV_CAP_AESCCMP)
161 ? "YES" : "no");
162 162
163 if (priv->rx_keycache_size) { 163 if (priv->rx_keycache_size) {
164 /* 164 /*
@@ -247,8 +247,7 @@ int p54_download_eeprom(struct p54_common *priv, void *buf,
247 247
248 if (!wait_for_completion_interruptible_timeout( 248 if (!wait_for_completion_interruptible_timeout(
249 &priv->eeprom_comp, HZ)) { 249 &priv->eeprom_comp, HZ)) {
250 printk(KERN_ERR "%s: device does not respond!\n", 250 wiphy_err(priv->hw->wiphy, "device does not respond!\n");
251 wiphy_name(priv->hw->wiphy));
252 ret = -EBUSY; 251 ret = -EBUSY;
253 } 252 }
254 priv->eeprom = NULL; 253 priv->eeprom = NULL;
@@ -523,9 +522,9 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell)
523 return 0; 522 return 0;
524 523
525err: 524err:
526 printk(KERN_ERR "%s: frequency change to channel %d failed.\n", 525 wiphy_err(priv->hw->wiphy, "frequency change to channel %d failed.\n",
527 wiphy_name(priv->hw->wiphy), ieee80211_frequency_to_channel( 526 ieee80211_frequency_to_channel(
528 priv->hw->conf.channel->center_freq)); 527 priv->hw->conf.channel->center_freq));
529 528
530 dev_kfree_skb_any(skb); 529 dev_kfree_skb_any(skb);
531 return -EINVAL; 530 return -EINVAL;
@@ -676,8 +675,8 @@ int p54_upload_key(struct p54_common *priv, u8 algo, int slot, u8 idx, u8 len,
676 break; 675 break;
677 676
678 default: 677 default:
679 printk(KERN_ERR "%s: invalid cryptographic algorithm: %d\n", 678 wiphy_err(priv->hw->wiphy,
680 wiphy_name(priv->hw->wiphy), algo); 679 "invalid cryptographic algorithm: %d\n", algo);
681 dev_kfree_skb(skb); 680 dev_kfree_skb(skb);
682 return -EINVAL; 681 return -EINVAL;
683 } 682 }
diff --git a/drivers/net/wireless/p54/led.c b/drivers/net/wireless/p54/led.c
index 9575ac033630..ea91f5cce6b3 100644
--- a/drivers/net/wireless/p54/led.c
+++ b/drivers/net/wireless/p54/led.c
@@ -57,8 +57,8 @@ static void p54_update_leds(struct work_struct *work)
57 57
58 err = p54_set_leds(priv); 58 err = p54_set_leds(priv);
59 if (err && net_ratelimit()) 59 if (err && net_ratelimit())
60 printk(KERN_ERR "%s: failed to update LEDs (%d).\n", 60 wiphy_err(priv->hw->wiphy,
61 wiphy_name(priv->hw->wiphy), err); 61 "failed to update leds (%d).\n", err);
62 62
63 if (rerun) 63 if (rerun)
64 ieee80211_queue_delayed_work(priv->hw, &priv->led_work, 64 ieee80211_queue_delayed_work(priv->hw, &priv->led_work,
@@ -102,8 +102,8 @@ static int p54_register_led(struct p54_common *priv,
102 102
103 err = led_classdev_register(wiphy_dev(priv->hw->wiphy), &led->led_dev); 103 err = led_classdev_register(wiphy_dev(priv->hw->wiphy), &led->led_dev);
104 if (err) 104 if (err)
105 printk(KERN_ERR "%s: Failed to register %s LED.\n", 105 wiphy_err(priv->hw->wiphy,
106 wiphy_name(priv->hw->wiphy), name); 106 "failed to register %s led.\n", name);
107 else 107 else
108 led->registered = 1; 108 led->registered = 1;
109 109
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c
index a5ea89cde8c4..822f8dc26e9c 100644
--- a/drivers/net/wireless/p54/p54pci.c
+++ b/drivers/net/wireless/p54/p54pci.c
@@ -466,8 +466,7 @@ static int p54p_open(struct ieee80211_hw *dev)
466 P54P_READ(dev_int); 466 P54P_READ(dev_int);
467 467
468 if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) { 468 if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) {
469 printk(KERN_ERR "%s: Cannot boot firmware!\n", 469 wiphy_err(dev->wiphy, "cannot boot firmware!\n");
470 wiphy_name(dev->wiphy));
471 p54p_stop(dev); 470 p54p_stop(dev);
472 return -ETIMEDOUT; 471 return -ETIMEDOUT;
473 } 472 }
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
index 4e6891099d43..427b46f558ed 100644
--- a/drivers/net/wireless/p54/txrx.c
+++ b/drivers/net/wireless/p54/txrx.c
@@ -38,8 +38,8 @@ static void p54_dump_tx_queue(struct p54_common *priv)
38 u32 largest_hole = 0, free; 38 u32 largest_hole = 0, free;
39 39
40 spin_lock_irqsave(&priv->tx_queue.lock, flags); 40 spin_lock_irqsave(&priv->tx_queue.lock, flags);
41 printk(KERN_DEBUG "%s: / --- tx queue dump (%d entries) ---\n", 41 wiphy_debug(priv->hw->wiphy, "/ --- tx queue dump (%d entries) ---\n",
42 wiphy_name(priv->hw->wiphy), skb_queue_len(&priv->tx_queue)); 42 skb_queue_len(&priv->tx_queue));
43 43
44 prev_addr = priv->rx_start; 44 prev_addr = priv->rx_start;
45 skb_queue_walk(&priv->tx_queue, skb) { 45 skb_queue_walk(&priv->tx_queue, skb) {
@@ -48,21 +48,23 @@ static void p54_dump_tx_queue(struct p54_common *priv)
48 hdr = (void *) skb->data; 48 hdr = (void *) skb->data;
49 49
50 free = range->start_addr - prev_addr; 50 free = range->start_addr - prev_addr;
51 printk(KERN_DEBUG "%s: | [%02d] => [skb:%p skb_len:0x%04x " 51 wiphy_debug(priv->hw->wiphy,
52 "hdr:{flags:%02x len:%04x req_id:%04x type:%02x} " 52 "| [%02d] => [skb:%p skb_len:0x%04x "
53 "mem:{start:%04x end:%04x, free:%d}]\n", 53 "hdr:{flags:%02x len:%04x req_id:%04x type:%02x} "
54 wiphy_name(priv->hw->wiphy), i++, skb, skb->len, 54 "mem:{start:%04x end:%04x, free:%d}]\n",
55 le16_to_cpu(hdr->flags), le16_to_cpu(hdr->len), 55 i++, skb, skb->len,
56 le32_to_cpu(hdr->req_id), le16_to_cpu(hdr->type), 56 le16_to_cpu(hdr->flags), le16_to_cpu(hdr->len),
57 range->start_addr, range->end_addr, free); 57 le32_to_cpu(hdr->req_id), le16_to_cpu(hdr->type),
58 range->start_addr, range->end_addr, free);
58 59
59 prev_addr = range->end_addr; 60 prev_addr = range->end_addr;
60 largest_hole = max(largest_hole, free); 61 largest_hole = max(largest_hole, free);
61 } 62 }
62 free = priv->rx_end - prev_addr; 63 free = priv->rx_end - prev_addr;
63 largest_hole = max(largest_hole, free); 64 largest_hole = max(largest_hole, free);
64 printk(KERN_DEBUG "%s: \\ --- [free: %d], largest free block: %d ---\n", 65 wiphy_debug(priv->hw->wiphy,
65 wiphy_name(priv->hw->wiphy), free, largest_hole); 66 "\\ --- [free: %d], largest free block: %d ---\n",
67 free, largest_hole);
66 spin_unlock_irqrestore(&priv->tx_queue.lock, flags); 68 spin_unlock_irqrestore(&priv->tx_queue.lock, flags);
67} 69}
68#endif /* P54_MM_DEBUG */ 70#endif /* P54_MM_DEBUG */
@@ -538,8 +540,7 @@ static void p54_rx_trap(struct p54_common *priv, struct sk_buff *skb)
538 case P54_TRAP_BEACON_TX: 540 case P54_TRAP_BEACON_TX:
539 break; 541 break;
540 case P54_TRAP_RADAR: 542 case P54_TRAP_RADAR:
541 printk(KERN_INFO "%s: radar (freq:%d MHz)\n", 543 wiphy_info(priv->hw->wiphy, "radar (freq:%d mhz)\n", freq);
542 wiphy_name(priv->hw->wiphy), freq);
543 break; 544 break;
544 case P54_TRAP_NO_BEACON: 545 case P54_TRAP_NO_BEACON:
545 if (priv->vif) 546 if (priv->vif)
@@ -558,8 +559,8 @@ static void p54_rx_trap(struct p54_common *priv, struct sk_buff *skb)
558 wiphy_rfkill_set_hw_state(priv->hw->wiphy, false); 559 wiphy_rfkill_set_hw_state(priv->hw->wiphy, false);
559 break; 560 break;
560 default: 561 default:
561 printk(KERN_INFO "%s: received event:%x freq:%d\n", 562 wiphy_info(priv->hw->wiphy, "received event:%x freq:%d\n",
562 wiphy_name(priv->hw->wiphy), event, freq); 563 event, freq);
563 break; 564 break;
564 } 565 }
565} 566}
@@ -584,8 +585,9 @@ static int p54_rx_control(struct p54_common *priv, struct sk_buff *skb)
584 p54_rx_eeprom_readback(priv, skb); 585 p54_rx_eeprom_readback(priv, skb);
585 break; 586 break;
586 default: 587 default:
587 printk(KERN_DEBUG "%s: not handling 0x%02x type control frame\n", 588 wiphy_debug(priv->hw->wiphy,
588 wiphy_name(priv->hw->wiphy), le16_to_cpu(hdr->type)); 589 "not handling 0x%02x type control frame\n",
590 le16_to_cpu(hdr->type));
589 break; 591 break;
590 } 592 }
591 return 0; 593 return 0;